2008-02-01から1ヶ月間の記事一覧
今回は、ランプ波形サンプリングに相当する処理の実現について考えてみます。 FM音源のオペレータの話題で、フェーズ・ジェネレータの話が出てきましたが、サイン波 ROM を使わずに、フェーズ・アキュムレータの値をそのまま信号として取り出せば、のこぎ…
前回の「gen_saw2.sce」プログラムに、オーバーサンプリング/デシメーションによる波形である「saw4s.wav」の生成を追加しました。
Python で書いた「gen_saw2.py」と同等のプログラムを Scilab を使って書いてみました。 当初の記事では Scilab 専用でしたが、GNU Octave 3.0.0 でも実行できるように、一部修正しました。
ランプ波形サンプリングによる wave ファイル「saw6.wav」をオシロスコープで観測した波形写真を下に示します。
ランプ波形のサンプリングによる方法の wave ファイルを作成する Python プログラム (gen_saw3.py) を下に示します。
これまでは、周波数領域で考えてきましたが、ここからは、時間波形で考えます。 理想のこぎり波をサンプリングしたときに、位相差が現れずに、DC オフセットが変化するだけになってしまったのは、簡単に言えば、波形が「理想的」過ぎたからです。 のこぎり波…
「saw2.wav」の 46.875 Hz のエイリアス成分は、HPF を通せば除去できますが、基本波の 4359.375 Hz の周辺の -20 dB 程度のスプリアス成分 (10 倍波や 12 倍波のエイリアス) は除去できません。 いったん、サンプル値になったものから、本来のベースバンド…
前のプログラムで作成した wave ファイルは (→こちら) に置きました。 「saw2.wav」をループ再生して、オシロスコープで観測した写真を下に示します。
ナイキスト周波数以下の帯域に制限する方法として、実用性は薄いけれど理想的な手段である、項数を制限したフーリエ級数の計算を採用します。 これまでの例では ですから、基本波から 5 倍波までを加算すれば、理想のこぎり波に理想特性のフィルタをかけたこ…
今回は、宿題の1問目の、 理想のこぎり波をサンプリングした場合に位相がズレない理由 の解答です。 答えは、ほとんど自明ですが、理想のこぎり波をサンプリングした場合には、ナイキスト周波数 (fs/2) 以上の成分が含まれていて、それがエイリアスとして影…
CQ 出版「デザインウェーブマガジン」2006年3月号付録基板 (FRK-ADuC) には ADI 製の ADuC7026 が搭載されています。 私は、ADuC7026 チップのリビジョンが「H3T」の基板 1 枚と、「I30」の基板 1 枚を持っています。 それぞれ 1 枚ずつなので、はっきりした…
前回の、位相をズラした理想のこぎり波をサンプリングした波形を左右のチャンネルに納めた wave ファイルを生成する Python プログラムを作りました。 後日説明する方法による、位相ズレがちゃんと現れるような手段で作成した波形の wave ファイルも同時に生…
今回は、ちょっと趣向を変えてみます。 アナログ信号のサンプリングではなく、ディジタル信号処理の中で直接的に信号を発生させた場合に、パラドックスというか、期待通りに行かないケースがあることを説明します。
ユニットを処理する unit() 関数は、「unit.c」ファイル中で定義されています。 unit() 関数では、まず、フィードバック処理を行い、次に、アルゴリズムの指定に従って、オペレータのモジュレータ/キャリアの処理を行って、キャリア出力を結果として返します…
オペレータを組み合わせて構成した、1音の「発音単位」のことを、ここでは「ユニット」(unit) と呼ぶことにします。 FM音源チップでは「チャンネル」と呼ばれており、一般的な音源の用語としては「ボイス」になります。 1音に複数の発音機構を割り当て、…
MA-2 オーサリング・ツール (ATS-MA2-SMAF) のFM音色エディタでセーブした、バンク単位の音色情報ファイル (.vma ファイル) の音色データ部のフォーマットを調べた結果を次に示します。
NRPN/RPN デコーダ NRPN (Non-Registered Parameter Number) と RPN (Registered Parameter Number) のパラメタ番号の指定は、NRPN/RPN それぞれ別のコントロール・チェンジに割り当てられています。 MSB / LSB の指定の順番には、特に規定はなく、どちらが…
コントロール・チェンジのデコード コントロール・チェンジ (およびモードメッセージ) をデコードする md_cc_func() 関数の本体は、switch 文ひとつです。 メッセージの第2バイト、つまりデータバイトの 1 バイト目の MD_2nd 変数の値がコントローラ・タイ…
システム・エクスクルーシブのデコード mididec() 関数の中で、エンド・オブ・エクスクルーシブ (EOX: 0xF7) によってシステム・エクスクルーシブ・メッセージの終結を認識すると、「sysxdec.c」ファイル中で定義されている sysx_dec() 関数を呼び出し、さら…
MIDI メッセージのデータバイト部分を処理する md_data_byte() 関数では、すでに読み込んだバイト数を示す MD_bcnt 変数を参照して処理を分けています。 言い忘れてましたが、デコード関係の関数は、「mididec.c」ファイル中に記述されています。 関数が呼び…
メインループの中では、MIDI/シリアル MIDI から 1 バイト受信するたびに MIDI メッセージのデコード関数である mididec() を呼び出しています。 mididec() 関数では、そのデータの到着で MIDI メッセージとして完成した場合には、それをデコードし、その処…
FM音源プログラムでは、内蔵デモ曲データの表現形式として、SMAF (Synthetic music Mobile Application Format) を採用しています。 以前はYAMAHA SMAF GLOBAL サイトで SMAF 仕様書の pdf ファイルをダウンロードできたのですが、現在では、サイト上に概…
実は LCD バッファはメインとサブの 2 組あって、切り換えて表示することができます。 サブ画面の方は、XG システム・エクスクルーシブの「ディスプレイ・レター・データ」*1で送られてきた ASCII 文字列を 3 秒間表示するのに使っています。 *1:フォーマッ…
各 LCD 画面について、説明しておきます。 ちなみに、この画像は LCD 画面を撮影したものではなく、プログラムで画像ファイルを作ったものです。 色合いは、バックライト付きの LCD をイメージしてあります。
FM音源プログラムでは、LCD による表示と、タクトスイッチ入力を利用した、次のような設定・表示の機能があります。 簡易 MIDI モニタ MIDI 受信チャンネル割り当て NRPN / RPN 表示 システム・エクスクルーシブ表示 システム設定 / CPU 負荷表示
話が前後してしまいましたが、FM音源プログラムの全体の構成について説明します。
オペレータについては、ほぼ説明しつくしたと思いますので、最後にプログラムの最適化について検討してみます。
フィードバック フィードバックとは、オペレータの位相変調入力に他のオペレータ出力を入れるのではなく、自分自身の出力を戻して変調をかける機能です。 サイン波の傾きが「上り坂」の部分では、フィードバックが傾きを増す方向に作用し、傾きが「下り坂」…
Wave Select 本来、FM音源の出力はサイン波が基本で、6 オペレータ、32 アルゴリズムを誇る DX7 の音源でもサイン波出力だけです。 オペレータ数の少ないローエンドのFM音源では、複雑な変調はできないことを補う意味もあって、OPL 系で言えば OPL II (Y…