ym2151でfm音源演奏
TRANSCRIPT
YM2151でFM音源演奏
七瀬 (@nanasetomona)
2015/07/14
@nanasetomona
https://github.com/nanase
きっかけ
• 「FM音源伝説」…FM音源LSIのガチャガチャ
▫ 秋葉原 東京ラジオデパート 1F
• 80年代にPCやゲーム機に内蔵の FM音源 および DAC
• 1月に YM2203C 入手
YM2151
• 6月にYM2151を入手
▫ 専用DACのYM3012も同時入手
▫ YAMAHA 1983年製造、ステレオデジタル
▫ OPM(FM Operator type M)、8ch、4オペレータ
▫ 擬似ノイズ発生器、LFO搭載
▫ クロック入力 3.58 [MHz]
▫ 動作電圧 5.0 [V]
YM2151
• 搭載実績
▫ アーケードゲーム (80年代中頃~90年代前半)
▫ MSXの周辺機器
▫ X68000
FM音源とは?
• FM変調を応用した波形発生法
• 単純な正弦波の発生を考える
𝑦(𝑡) = 𝐴 sin 2𝜋𝑓𝑡
-1
0
1
𝑡
𝑦 𝑡
FM音源とは?
• 𝐴 は振幅 (ここでは 1)
• 2𝜋𝑓 は角速度(≒周波数)、2𝜋𝑓𝑡 は位相
▫ 位相に注目して考える
𝑦(𝑡) = 𝐴 sin 2𝜋𝑓𝑡
-1
0
1
𝑡
𝑦 𝑡
FM音源とは?
• 位相の歪み = 時計の針が速く、遅くなる
• 位相の変化を乱すような別の正弦波を加える
𝑦(𝑡) = 𝐴 sin(2𝜋𝑓1𝑡 + 𝛽 sin 2𝜋𝑓2𝑡)
-1
0
1
𝑡
𝑦 𝑡
(𝛽 = 1)
FM音源とは?
• 𝑓1, 𝑓2 はそれぞれ キャリア、モジュレータ周波数
• 𝛽 は変調指数 = 歪みの強さ
▫ 𝛽 を大きくすると複雑な波形が発生
𝑦(𝑡) = 𝐴 sin(2𝜋𝑓1𝑡 + 𝛽 sin 2𝜋𝑓2𝑡)
-1
0
1
𝑡
𝑦 𝑡
(𝛽 = 2.5)
FM音源とは?
• 複数(0個以上)のモジュレータ入力を持つ
正弦波発生器を オペレータ と呼ぶ
▫ 通常は音量を調整するための乗算器も内蔵
• 通常はオペレータを複数段重ねて使用する
オペレータ オペレータ
オペレータ
オペレータ
フィードバック
モジュレーション
モジュレーション
モジュレーション
出力
FM音源とは?
• オペレータの繋ぎ方を アルゴリズム と呼ぶ
▫ 直列に近い形ほど複雑な音となる
▫ 並列に近い形ほど軽い音となる
オペレータ オペレータ
オペレータ
オペレータ
フィードバック
モジュレーション
モジュレーション
モジュレーション
出力
FM音源の利点
• 複雑な波形を生成可能
▫ 矩形波や三角波よりも多彩な音作りが可能
▫ パイプオルガン、エレピ、金属音 の再現が強い
• 少ないデータ量で生成可能
▫ PCM音源は波形そのものを記録するためデータ多
▫ FM音源はキャリア、モジュレータに関わるデータのみ
▫ 初期の携帯電話に搭載(着信音など)
FM音源の欠点
• データから生成される波形の予想がつきにくい
▫ 僅かな誤差で全く異なる波形となる場合もあり
▫ 理想波形を作るにはFM音源の知識が必要
• ピアノ、パーカッションは苦手
FM2151に必要なもの
• 5.0 [V] 電源
• 4.0 [MHz] クロック
• DAC (YM3012)
• オペアンプ
• 制御マイコン
• シーケンサ
• 演奏データ
電源
• USB 給電により供給
▫ PC から給電するとノイズや電流不足の原因となる
▫ (YM2151単体でも 110 [mA] 程度の消費)
▫ 今回はモバイルブースターを使用
オペアンプ
• LMC6484AIN を使用
▫ ナショナルセミコンダクタ製
▫ CMOSタイプ、単電源 5.0 [V] のみで動作
▫ DACの他、ボルテージフォロワとして使用
余談: オペアンプは重要
LMC6484AIN (単価: 250円)
LM324N (単価: 38円)
符号反転時に パルスが発生
余談: オペアンプは重要
LMC6484AIN (単価: 250円)
LM324N (単価: 38円)
符号反転時に パルスが発生
制御マイコン
• NUCLEO-F401RE
▫ USB給電、プログラムライタ付き
▫ mbedで開発 (webIDE、C++)
▫ Arduino互換ピン装備
▫ フラッシュメモリ 512KB
▫ SRAM 96KB
▫ 最大 84 [MHz] 動作
▫ 1,500円ほどで購入
クロック
• F401REから 4.0 [MHz] を発振
▫ プログラム上では 1.0 [MHz] が最大
▫ プログラムライタ上のクリスタル 8.0 [MHz] を使用 (2分周)
▫ CPUの16 [MHz]も使用可
RC発振のため精度は悪い
データ送信
• PCから書き込みデータをシリアル通信
▫ 通信速度は 115,200 bps (14.4 kB/s)
▫ これより高速だと頻繁に同期が壊れる
• コマンド、アドレス、データの計3バイト1メッセージ
▫ コマンドはリセットや書き込みのフラグ用
▫ アドレスは $00 – $FF
▫ データも同様
YM2151のレジスタ構成
• アドレス空間は256バイト
• オペレータや 周波数設定など
• データバスを介して 書き込みを行う (今回は書き込みのみ)
YM2151のクロック入力
• 今回は 4.0 [MHz]、標準は 3.58 [MHz]
• 3.579545 [MHz] は NTSC で頻繁に使われる
▫ 外部と同一クロックを用いた回路の 簡略化が図られていた
▫ NTSC と PAL とではデータ送信のタイミングが異なる
▫ PALでは 4.43362 [MHz]
• 発音周波数に影響し、11.7% ほど高音になる
▫ およそ 2 音くらい (ド → レ)
YM2151のウェイト時間
• レジスタの書き込みに時間がかかる
▫ マスタークロック ΦM = 4 [MHz] 時
▫ アドレス: 17サイクル = 4.25 [μs]
▫ データ: 83サイクル = 20.75 [μs]
▫ 初期化時: 77サイクル = 19.25 [μs]
• 本来はYM2151からビジーフラグを読み取り
書き込み完了を検知する (今回は省略)
YM2151鳴動までの手順
1. イニシャルクリア (IC = L)
2. オペレータ設定 (TL, ML)
3. エンベロープ設定 (AR, D1R, D2R, D1L, RR)
4. パン設定 (L ch = 1, R ch = 1)
5. 周波数設定 (KC)
6. ノートオン命令 (KeyON/OFF, ChNum)
音色 指定時
発音毎
シーケンサ
• C# でMIDI→YM2151データに変換
• MidiUtils がシーケンスを行う
https://github.com/nanase/MidiUtils
• MIDIデータは8音8chのものを用意しておく
YM2151シールド
回路図
実際に鳴らしてみた
https://www.youtube.com/watch?v=Yv1CD4-HYUY
課題 (1)
• 128音色+ドラム音色がないと発音できない
• ドラムパートが 1ch 分しかない
▫ 同時に2つ以上の打楽器を鳴らせない
• リアルタイムにMIDI変換しているため、 またはシリアル通信のため遅延が発生
▫ 一度に多量のデータを送らない工夫が必要
▫ SRAMにあらかじめデータをキャッシュすれば良い?
課題 (2)
• ノイズ発生器の動作の解析
▫ FM音源とノイズは同時に発音可能
▫ 一部エンベロープはノイズに対しても有効?
• USBで給電すると 4.2 – 4.0 [V] まで電圧が降下
▫ 原因不明
参考資料 (1) • YM2203・YMZ294・SP0256を使ったハードウエアMIDI音源の製作
http://park19.wakwak.com/~gadget_factory/factory/miditalk/
• YM2203のピン機能 -滴了庵日録
http://d.hatena.ne.jp/licheng/20131110/p1
• MIDI音源の自作 YM-2203 OP-N 2個使用
http://mars.bellstek.net/s/midi/04/00.htm
• YM2608 OPNA アプリケーションマニュアル
http://hackipedia.org/Platform/Sega/Genesis/hardware,%20FM%20synthesis,%20
YM2608/pdf/YM2608J.PDF
参考資料 (2) • NucleoのClock - 電子工作専科のぐうたラボ
http://denshikousakusenka.blog.fc2.com/blog-entry-33.html
• FM音源レジスタマップX68k
http://www16.atwiki.jp/mxdrv/pages/24.html
• YM2151 Datasheet
http://www.msxarchive.nl/pub/msx/docs/datasheets/ym2151synthesis.pdf
http://map.grauw.nl/resources/sound/yamaha_ym2151_datasheet.pdf
参考資料 (3) • FM音源伝説 | FM音源を愛するすべての人へ
http://ym2203.com/
• FM音源の基礎知識
http://www.hikari-ongaku.com/study/fm.html