読者です 読者をやめる 読者になる 読者になる

ごちゃログぴこっ

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

ピコカキコ - WAV13によるPCM再生の考え方

WAV13によるPCM再生とは何か、例えばこのピコカキコを聴いてみてください。

両サイドで鳴っているパッドの音、それにドラムの音、とても綺麗です。どちらもトリッキーな鳴らし方をしているようですが、この記事ではドラムで使われている技法を主に追求します。

ピコカキコ WAV13 PCM利用補助ツールを作成しました。後述の面倒な計算が一瞬で行えます。実用的な面だけ知りたい人は、まずツールのページを読んで、それから情報を本記事で補うと良いかもです。

美しいPCMの鳴らし方 ~ロジックとトリック

ドラムの音など、サンプリングした音色を鳴らしたい場合、普通はファミコンDPCMに相当するWAV9を使用します。しかし、WAV9の性能はファミコン由来なので音質は低く、音程も15段階でしか鳴らせません。普通はパーカッションはDPCMで妥協し、音色は各種波形でなんとか近いものを作成することになります。

知る限り、これを克服して品質の高いサンプルを鳴らすトリッキーな方法が3つあります。(熟練の人はもっと知っているかも)

  • ピコカキコ、楽しいよ! のPCMテストで知られる手法(PCM変換スクリプトと説明)。テンポを超高速にする必要があるため、単発で鳴らさなければならない。
  • WAV9 の DPCM に @L コマンドで LFO をかけると音程が取れるバグを利用した高サンプルレート再生*1(上記ピコカキコの両側のパッド音で使用)
  • WAV13 の波形メモリを超低音で鳴らして任意の8bit波形を鳴らす。後ほど考察するが、音程や発音の長さを巧みに調整する必要がある*2(上記ピコカキコの両側のドラム音で使用)

本記事では、一番最後の手法を自身の楽曲に組み入れたい場合の考え方を考察します。わかりやすく書きたいところですが、話の性質上MMLや波形に関する一定の知識が必要です。

WAV13 の特徴

WAV13の説明は FlMML - Documentation にありますが、可変長(長さ上限あり)の符号なし8bit波形メモリ音源です。

本来は周期的に繰り返される短い波形を扱うものです。1周期分の波形を16進数で書いて波形定義します。なので、例えば o5a (440 Hz) のノートを発音すると、定義した波形が1秒間に440回繰り返される周波数で再生されます。

例えば、1024サンプルの波形を定義したとして、440 Hz で鳴らすと再生周波数は 440×1,024=450,560 Hz というとんでもない高さになります。代わりに、例えば音階をぐっと下げて 7.8125 Hz で鳴らすと 7.8125×1,024=8000 Hz という現実的な WAVE ファイルらしい再生周波数になります。超低音ノートで鳴らすことで WAV13 は 8bit PCM として活用できるのです。

WAV13 を利用する問題点

WAV13をワンショットPCMとして使用するには下記の問題点があります。

  • 【問題】周期波形であるため、発音が波形終端に達した後で先頭に戻ってしまう。
    • 【対策】発音する長さをtick単位で制御してループ直前で止める。休符を併用してリズムを取る。(実質マクロ利用が必須)
  • 【問題】1024サンプルは短く、な波形を一つ鳴らすにも不自由することが少なくない。
    • 【対策】複数のWAV13定義波形をシームレスに鳴らして1024サンプルの壁を超える。
      • 【問題】テンポが変動すると波形がうまくつながらなくなる。特効薬はない。

なんだかむつかしくないですか!? わたしはこれで半日も悩みました!

実用へのアプローチ(理論的な話)

上述の通り、音程や音長をシビアに調整しなければなりません。最も解像度が低く調整困難なのはノートの長さです。よって、1つの波形が何tickに相当するのか決定するところから、各種の調整を行います。

  1. バンクあたりの再生時間(tick単位)を決定する
  2. バンクの再生時間とサンプル数からサンプリングレートを求める(リサンプリングに使用)
  3. バンクの再生時間から再生周波数を計算し、音階とディチューンの値を求める
  4. 求めた音階とディチューンと再生時間で入力波形を鳴らす

このような順序になります。音色定義時のサンプル数ですが、サンプル数が変動すると想定サンプリングレートが変化してしまうため、定義は一律最大サンプル数になるように最終サンプルを複製します。

細かく計算式を書くと面倒なので、知りたい方は補助ツールのソースコードから読み解いてください。

計算に必要な定数

簡単に WAV13 PCM サンプルを使う方法!

上記の説明は概念的過ぎますし、詳細が理解できる人でもいちいち計算するのは面倒です。なので、ピコカキコ WAV13 PCM利用補助ツールを作成しました。面倒で謎に包まれた計算が一瞬で行えます。

  1. 上記ツールにテンポや再生時間の情報を適当に入力する
  2. 波形ファイルを「PCM サンプリングレート」に極力近い値にリサンプリングして保存 (Microsoft WAVE, 8 bit モノラル PCM, サンプリングレートの変換には SSRC などのツールを利用)
  3. Stirling などのバイナリエディタで波形部分 (data セクション部) を抜き出し、WAV13 波形として定義する。
    1. 長さが「最大サンプル数」を超える場合は複数の波形定義に分割する。
    2. 長さが「最大サンプル数」より短い定義は、最終バイトを複製して「最大サンプル数」まで増やす。(ただし、仕組みを理解していれば短いまま使うこともできる。「最大サンプル数」を変更して計算を行い、得られたノート再生コマンドを使えばよいだけの話)
  4. 「ノート再生コマンド」で波形が鳴ることを確認する。(波形を分割している場合、@13-? o0b%12 ~ の部分を異なる波形で連続して行えば良い)
  5. 音声再生マクロを作成すると楽曲での使い勝手が格段に向上する(WAV13利用例 参照)

以上です! ぜひ素晴らしいピコカキコを作ってください!

*1:バグのようなので挙動が保証されないのが問題ですが、音程を変更しやすいのでメロディ音色に使えます。これはWAV13では乏しい利点です。

*2:2つ以上のサンプルをつなげて使うことが多いですが、そうすると特にテンポ変更や音程変更ができないので、音程の固定されたパーカッションなどに使うことになります。