SlideShare une entreprise Scribd logo
1  sur  34
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Argoによる機械学習実行基盤の構築・運用からみえてきたこと
Argoによる機械学習実行基盤の構築・運用からみえてきたことArgoによる機械学習実行基盤の構築・運用からみえてきたこと
Argoによる機械学習実行基盤の構築・運用からみえてきたことShinsaku Kono
 
金融時系列解析入門 AAMAS2021 著者発表会
金融時系列解析入門 AAMAS2021 著者発表会金融時系列解析入門 AAMAS2021 著者発表会
金融時系列解析入門 AAMAS2021 著者発表会Katsuya Ito
 
音声の認識と合成
音声の認識と合成音声の認識と合成
音声の認識と合成Akinori Ito
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
特徴ベクトル変換器を作った話 #dogenzakalt
特徴ベクトル変換器を作った話 #dogenzakalt特徴ベクトル変換器を作った話 #dogenzakalt
特徴ベクトル変換器を作った話 #dogenzakaltTokoroten Nakayama
 
ゲーム木探索技術とコンピュータ将棋への応用
ゲーム木探索技術とコンピュータ将棋への応用ゲーム木探索技術とコンピュータ将棋への応用
ゲーム木探索技術とコンピュータ将棋への応用Shogo Takeuchi
 
マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術MicroAd, Inc.(Engineer)
 
ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)
ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)
ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)ASTERIA User Group
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
分布あるいはモーメント間距離最小化に基づく統計的音声合成
分布あるいはモーメント間距離最小化に基づく統計的音声合成分布あるいはモーメント間距離最小化に基づく統計的音声合成
分布あるいはモーメント間距離最小化に基づく統計的音声合成Shinnosuke Takamichi
 
自称・世界一わかりやすい音声認識入門
自称・世界一わかりやすい音声認識入門自称・世界一わかりやすい音声認識入門
自称・世界一わかりやすい音声認識入門Tom Hakamata
 
音楽波形データからコードを推定してみる
音楽波形データからコードを推定してみる音楽波形データからコードを推定してみる
音楽波形データからコードを推定してみるKen'ichi Matsui
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
今さら聞けないasteria warp運用の基礎 ファイナル
今さら聞けないasteria warp運用の基礎 ファイナル今さら聞けないasteria warp運用の基礎 ファイナル
今さら聞けないasteria warp運用の基礎 ファイナルASTERIA User Group
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料SECCON Beginners
 
Elasticsearchのサジェスト機能を使った話
Elasticsearchのサジェスト機能を使った話Elasticsearchのサジェスト機能を使った話
Elasticsearchのサジェスト機能を使った話ktaro_w
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
Crfと素性テンプレート
Crfと素性テンプレートCrfと素性テンプレート
Crfと素性テンプレートKei Uchiumi
 

Tendances (20)

Argoによる機械学習実行基盤の構築・運用からみえてきたこと
Argoによる機械学習実行基盤の構築・運用からみえてきたことArgoによる機械学習実行基盤の構築・運用からみえてきたこと
Argoによる機械学習実行基盤の構築・運用からみえてきたこと
 
金融時系列解析入門 AAMAS2021 著者発表会
金融時系列解析入門 AAMAS2021 著者発表会金融時系列解析入門 AAMAS2021 著者発表会
金融時系列解析入門 AAMAS2021 著者発表会
 
音声の認識と合成
音声の認識と合成音声の認識と合成
音声の認識と合成
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
特徴ベクトル変換器を作った話 #dogenzakalt
特徴ベクトル変換器を作った話 #dogenzakalt特徴ベクトル変換器を作った話 #dogenzakalt
特徴ベクトル変換器を作った話 #dogenzakalt
 
ゲーム木探索技術とコンピュータ将棋への応用
ゲーム木探索技術とコンピュータ将棋への応用ゲーム木探索技術とコンピュータ将棋への応用
ゲーム木探索技術とコンピュータ将棋への応用
 
マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術マイクロアドのアドテクを支える技術
マイクロアドのアドテクを支える技術
 
ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)
ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)
ASTERIA WARP開発前に知っておくべき10の鉄則(AUG関西支部編)
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
分布あるいはモーメント間距離最小化に基づく統計的音声合成
分布あるいはモーメント間距離最小化に基づく統計的音声合成分布あるいはモーメント間距離最小化に基づく統計的音声合成
分布あるいはモーメント間距離最小化に基づく統計的音声合成
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
自称・世界一わかりやすい音声認識入門
自称・世界一わかりやすい音声認識入門自称・世界一わかりやすい音声認識入門
自称・世界一わかりやすい音声認識入門
 
音楽波形データからコードを推定してみる
音楽波形データからコードを推定してみる音楽波形データからコードを推定してみる
音楽波形データからコードを推定してみる
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
今さら聞けないasteria warp運用の基礎 ファイナル
今さら聞けないasteria warp運用の基礎 ファイナル今さら聞けないasteria warp運用の基礎 ファイナル
今さら聞けないasteria warp運用の基礎 ファイナル
 
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
 
Elasticsearchのサジェスト機能を使った話
Elasticsearchのサジェスト機能を使った話Elasticsearchのサジェスト機能を使った話
Elasticsearchのサジェスト機能を使った話
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
Crfと素性テンプレート
Crfと素性テンプレートCrfと素性テンプレート
Crfと素性テンプレート
 

Plus de Tomona Nanase

大海原の小さなイルカ
大海原の小さなイルカ大海原の小さなイルカ
大海原の小さなイルカTomona Nanase
 
僕と契約プログラミングしようよ
僕と契約プログラミングしようよ僕と契約プログラミングしようよ
僕と契約プログラミングしようよTomona Nanase
 
kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)Tomona Nanase
 
自作プログラミング言語 Lury
自作プログラミング言語 Lury自作プログラミング言語 Lury
自作プログラミング言語 LuryTomona Nanase
 
それでもC#使いたい
それでもC#使いたいそれでもC#使いたい
それでもC#使いたいTomona Nanase
 

Plus de Tomona Nanase (6)

大海原の小さなイルカ
大海原の小さなイルカ大海原の小さなイルカ
大海原の小さなイルカ
 
僕と契約プログラミングしようよ
僕と契約プログラミングしようよ僕と契約プログラミングしようよ
僕と契約プログラミングしようよ
 
kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)
 
自作プログラミング言語 Lury
自作プログラミング言語 Lury自作プログラミング言語 Lury
自作プログラミング言語 Lury
 
それでもC#使いたい
それでもC#使いたいそれでもC#使いたい
それでもC#使いたい
 
History of Xylph
History of XylphHistory of Xylph
History of Xylph
 

YM2151でFM音源演奏