FM音源

周波数成分を 90° 移相した三角波による FM 合成

約 1 年前の 2019 年 3 月 7 日付けの記事 (こちら→) で示した、三角波のすべての周波数成分の位相を 90° 移相して得られた「ずんぐりとした正弦波」状の波形を FM 音源の波形のひとつとして追加し、合成波形を見てみました。 最小限のパラメタのみを変更可…

FM音源プログラム (35) -- 速い ARM、遅い ARM

CQ 出版「デザインウェーブマガジン」2006年3月号付録基板 (FRK-ADuC) には ADI 製の ADuC7026 が搭載されています。 私は、ADuC7026 チップのリビジョンが「H3T」の基板 1 枚と、「I30」の基板 1 枚を持っています。 それぞれ 1 枚ずつなので、はっきりした…

FM音源プログラム (34) -- ユニット

ユニットを処理する unit() 関数は、「unit.c」ファイル中で定義されています。 unit() 関数では、まず、フィードバック処理を行い、次に、アルゴリズムの指定に従って、オペレータのモジュレータ/キャリアの処理を行って、キャリア出力を結果として返します…

FM音源プログラム (33) -- データ構造

オペレータを組み合わせて構成した、1音の「発音単位」のことを、ここでは「ユニット」(unit) と呼ぶことにします。 FM音源チップでは「チャンネル」と呼ばれており、一般的な音源の用語としては「ボイス」になります。 1音に複数の発音機構を割り当て、…

FM音源プログラム (32) -- 音色データ・フォーマット

MA-2 オーサリング・ツール (ATS-MA2-SMAF) のFM音色エディタでセーブした、バンク単位の音色情報ファイル (.vma ファイル) の音色データ部のフォーマットを調べた結果を次に示します。

FM音源プログラム (31) -- MIDI デコーダ(5)

NRPN/RPN デコーダ NRPN (Non-Registered Parameter Number) と RPN (Registered Parameter Number) のパラメタ番号の指定は、NRPN/RPN それぞれ別のコントロール・チェンジに割り当てられています。 MSB / LSB の指定の順番には、特に規定はなく、どちらが…

FM音源プログラム (30) -- MIDI デコーダ(4)

コントロール・チェンジのデコード コントロール・チェンジ (およびモードメッセージ) をデコードする md_cc_func() 関数の本体は、switch 文ひとつです。 メッセージの第2バイト、つまりデータバイトの 1 バイト目の MD_2nd 変数の値がコントローラ・タイ…

FM音源プログラム (29) -- MIDI デコーダ(3)

システム・エクスクルーシブのデコード mididec() 関数の中で、エンド・オブ・エクスクルーシブ (EOX: 0xF7) によってシステム・エクスクルーシブ・メッセージの終結を認識すると、「sysxdec.c」ファイル中で定義されている sysx_dec() 関数を呼び出し、さら…

FM音源プログラム (28) -- MIDI デコーダ(2)

MIDI メッセージのデータバイト部分を処理する md_data_byte() 関数では、すでに読み込んだバイト数を示す MD_bcnt 変数を参照して処理を分けています。 言い忘れてましたが、デコード関係の関数は、「mididec.c」ファイル中に記述されています。 関数が呼び…

FM音源プログラム (27) -- MIDI デコーダ(1)

メインループの中では、MIDI/シリアル MIDI から 1 バイト受信するたびに MIDI メッセージのデコード関数である mididec() を呼び出しています。 mididec() 関数では、そのデータの到着で MIDI メッセージとして完成した場合には、それをデコードし、その処…

FM音源プログラム (26) -- SMAF シーケンサ

FM音源プログラムでは、内蔵デモ曲データの表現形式として、SMAF (Synthetic music Mobile Application Format) を採用しています。 以前はYAMAHA SMAF GLOBAL サイトで SMAF 仕様書の pdf ファイルをダウンロードできたのですが、現在では、サイト上に概…

FM音源プログラム (25) -- LCD 表示 (3)

実は LCD バッファはメインとサブの 2 組あって、切り換えて表示することができます。 サブ画面の方は、XG システム・エクスクルーシブの「ディスプレイ・レター・データ」*1で送られてきた ASCII 文字列を 3 秒間表示するのに使っています。 *1:フォーマッ…

FM音源プログラム (24) -- LCD 表示 (2)

各 LCD 画面について、説明しておきます。 ちなみに、この画像は LCD 画面を撮影したものではなく、プログラムで画像ファイルを作ったものです。 色合いは、バックライト付きの LCD をイメージしてあります。

FM音源プログラム (23) -- LCD 表示 (1)

FM音源プログラムでは、LCD による表示と、タクトスイッチ入力を利用した、次のような設定・表示の機能があります。 簡易 MIDI モニタ MIDI 受信チャンネル割り当て NRPN / RPN 表示 システム・エクスクルーシブ表示 システム設定 / CPU 負荷表示

FM音源プログラム (22) -- 全体の構成

話が前後してしまいましたが、FM音源プログラムの全体の構成について説明します。

FM音源プログラム (21) -- オペレータ (14)

オペレータについては、ほぼ説明しつくしたと思いますので、最後にプログラムの最適化について検討してみます。

FM音源プログラム (20) -- オペレータ (13)

フィードバック フィードバックとは、オペレータの位相変調入力に他のオペレータ出力を入れるのではなく、自分自身の出力を戻して変調をかける機能です。 サイン波の傾きが「上り坂」の部分では、フィードバックが傾きを増す方向に作用し、傾きが「下り坂」…

FM音源プログラム (19) -- オペレータ (12)

Wave Select 本来、FM音源の出力はサイン波が基本で、6 オペレータ、32 アルゴリズムを誇る DX7 の音源でもサイン波出力だけです。 オペレータ数の少ないローエンドのFM音源では、複雑な変調はできないことを補う意味もあって、OPL 系で言えば OPL II (Y…

FM音源プログラム (18) -- オペレータ (11)

フェーズアキュムレータから 14 ビット分を抽出して、下の図のように b13 を「S」ビット、b12 を「D」ビットと呼ぶことにします。

FM音源プログラム (17) -- オペレータ (10)

今度は、サイン波テーブルの参照方法についての話です。 前の議論で、フェーズアキュムレータを N ビットとしましたが、その上位 M ビットを抽出して、サイン波テーブルの参照に使うものとします。

FM音源プログラム (16) -- オペレータ (9)

F-NUMBER 計算 以前示した F-NUMBER の計算式には、サンプリング周波数が含まれていますから、F-NUMBER の値はサンプリング周波数に依存します。 FM音源プログラムでは、サンプリング周波数の切り替え機能を持たせたので、何も対策しないと、 F-NUMBER テ…

FM音源プログラム (15) -- オペレータ (8)

ポルタメント処理 アナログシンセでは、キーボード回路のサンプル&ホールド (正確にはトラック&ホールド) 回路にポルタメント機能を持たせることが多いようです。 ホールド・コンデンサと、ポルタメント時間調整用の可変抵抗で1次 RC 回路を構成し、その…

FM音源プログラム (14) -- オペレータ (7)

OPL3 の音源チップでは、F-NUMBER/BLOCK の組で受け取ったピッチ情報に対して、チップ内部でビブラートをかけます。 ピッチベンド/ポルタメントなどに関しては、チップにその機能はないので、ドライバ/アプリケーション・プログラム側で実現することになりま…

FM音源プログラム (13) -- オペレータ (6)

OPL3 の音源チップでは、リニア周波数的な表現である F-NUMBER、BLOCK の組でピッチ情報を指定します。 一方、KSL (Level Key Scale) では、1 オクターブ当り何 dB という形で出力レベルに補正が加えられます。 この変換は、下の表にしたがって、チップ内部…

FM音源プログラム (12) -- オペレータ (5)

F-NUMBER 「YMF715x (OPL3-SA3) -Register Description Document-」(以下「rege」と略記) では、 F-NUMBER について、 Frequency Information : These bits determine the frequency information for one octave. と説明しています。

FM音源プログラム (11) -- オペレータ (4)

次は、フェーズ・ジェネレータ (phase generator) まわりの話です。

FM音源プログラム (10) -- オペレータ (3)

今回は、「表の分割」と「補間」についての話です。

FM音源プログラム (9) -- オペレータ (2)

今回は、サイン波テーブルについての話です。

FM音源プログラム (8) -- オペレータ (1)

順序が前後しましたが、FM音源のオペレータの話です。

FM音源プログラム (7) -- EG (7)

次はディケイ/リリース・レートについて検討します。