このピコカキコを聴くと、ストリングスの音が綺麗になっています。音階が必要なサンプル波形がどうしてこのように鳴らせるのでしょうか?
FlMML の DPCM に LFO をかけると、通常のメロディ波形のように音程が取れるようになります。波形のループも可能です。上記MMLではこの技を使っています。
DPCM 楽器の具体的な使い方
- DPCM Converter などで音色の定義を作成(FamiTracker など他のツールでも可、DPCMの制約については後述の「ループ波形を作成する際の注意」も参照)
- 音色指定時に下記のように @L を伴って指定する(音量を持続したければ @E1 も忘れずに)
/* 音色指定 */ @9-0 @L3882,0,2 @E1,0,0,350,0 /* 発音テスト */ o4a /* 波形定義:波形再生ループ時は3番目のパラメータを1にする */ #WAV9 0,64,0,... /* おまけ:ちなみに、普通に LFO が使いたい場合、音程補正は @D でも NS でも代用可 */ @9-0 @L50,48,0,24,2 @E1,0,0,350,0 @D3882
@L の記述はディチューンと同等です(ただし負数は指定不可)。最初のパラメータは cent 単位の音程指定なので、これを±100して音階を調節します。では下二桁は00で良いのかというとそうではなく、この値は入力サンプルレートに依存します(ただし、後述のとおり自由なサンプルレートが使えるので、下記の表は気にしなくて良いです)。
番号 | サンプルレート | @L指定値(下二桁) | @L指定値(o4a/220Hz基準) |
---|---|---|---|
0 | 4181.71 Hz | 02 or 98 | 298 |
1 | 4709.93 Hz | 04 or 96 | 504 |
2 | 5264.04 Hz | 03 or 97 | 697 |
3 | 5593.04 Hz | 02 or 98 | 802 |
4 | 6257.95 Hz | 04 or 96 | 996 |
5 | 7046.35 Hz | 02 or 98 | 1202 |
6 | 7919.35 Hz | 04 or 96 | 1404 |
7 | 8363.42 Hz | 02 or 98 | 1498 |
8 | 9419.86 Hz | 04 or 96 | 1704 |
9 | 11186.08 Hz | 02 or 98 | 2002 |
10 | 12604.03 Hz | 08 or 92 | 2208 |
11 | 13982.60 Hz | 12 or 88 | 2388 |
12 | 16884.65 Hz | 15 or 85 | 2714 |
13 | 21306.82 Hz | 17 or 83 | 3117 |
14 | 24857.95 Hz | 16 or 84 | 3384 |
15 | 33143.94 Hz | 18 or 82 | 3882 |
音程の上限としては @L2400,0,2 の場合で o8g+ まで出せるようです。@L3600,0,2 のように補正を1オクターブ上げると、指定可能なノートの上限は o7g+ に下がります。サンプルレートが上がるほど、高い音は出なくなります。
波形あたりのサンプル数は、最大 32647 サンプルです。
高品質な音色を使うポイント「サンプルレート」
上記の情報を元に 33.14 kHz の DPCM を作成しても、波形のノイズ等に満足できないこともあると思います。これを解決するにはさらに大きくサンプルレートを上げてしまいましょう。
解決法はさまざまですが、手軽な方法を一例として紹介します。聞々ハヤえもんで波形を読み込んで、「再生周波数 25.0%」にしたファイルを保存・DPCM変換しましょう。きっと感じがだいぶ変わると思います。(なお、ごちゃ版の DPCMConverter.swf であれば、高サンプルレートのWAVEファイルをリサンプリングなしで変換することも可能です)
サンプルレートを上げることで、品質向上が狙える可能性があります。その理由は2つ。
- 高域が失われないため、こもった感じがなくなる(一般的なハイサンプリングの利点)
- ファミコンDPCMは差分を1bit(±1)で記録するため、サンプル同士の変化が激しいと誤差が大きくなり劣化を生む。同じ鳴り方をする波形でも高サンプルレートにすることでサンプル間の差が小さくなれば、誤差が軽減されて音質が改善される可能性がある。
- DPCMは「変動なし」という情報を記録できないため、サンプル間の差が小さすぎる場合にも振動による誤差が生じる。差が大きすぎる場合に比べて弊害は少ないが、サンプル数を上げれば必ず音質が改善されるとは言えないことに注意。
一方で、下記のようなデメリットがあります。
- 波形の長さ(秒)はサンプルレートに反比例して短くなります。
- サンプルレートを上げると音程補正の度合いも大きくなる分、鳴らせる音階の幅はせまくなります。
このあたりの調整は、ひとつの頑張りどころと言えそうです。
任意のサンプルレートを持つ波形が o4a で鳴るようにするための cent 補正値が知りたい場合、下記の式を Google に計算してもらえばOKです。
(log(任意のサンプルレート / 220 / 16) * 1200) / log(2)
DPCM を作成する際の注意(特にループ波形)
下記の点に留意する必要があります。
- 常に波形の先頭からループする(中間にループポイントは設定不可)
- 波形サイズは 1+16n バイトでなくてはなりません(ループに関わらず NES DMC の仕様)
- ピコカキコのプレイヤーはこの制約をちゃんと守っており、余剰バイトは内部で捨てられます。
- 波形サイズは 1+16n バイトというのは、レート変換後の波形サンプル数が 8+256n でなければならないことを意味します。厄介ですが仕様なので仕方ありません。
- DPCM がループする際に音量値は初期値に戻らない。つまり1周目と2周目で波形が異なってしまう可能性がある。
- 最大サイズは $FF1 バイト、サンプル数にして 32648 サンプル。
使用するコンバータはお好みで良いのですが、私見を以下に記します。
- arche さん作の DPCMConverter.swf には致命的なバグ*1があるので使わないほうが良いです(2013年5月2日時点)。また、DPCMのサイズ境界(1+16n)も考慮されていないため、末尾のサンプルが消失してしまう問題も抱えています。本記事でリンクしているバージョンはいずれも修正済であるため問題ありません。
- 細かい違いはありますが、FamiTracker (PCMImport.cpp) と DMCconv の変換処理はほぼ同等です。FamiTracker の方が高品質なリサンプリングを行う。どちらも入力サンプル数が8で割り切れない場合は余った末尾サンプルを捨てます。どちらも最初の出力サンプルは初期値になりません(初期値同士を比較して符号化しているため)。
ポイントをまとめると以下のようになります。
- バグがある DPCMConverter.swf は使わない。あとは各自の好みでOK。
- ループ波形は長さを 8+256n サンプルにしなければならない。
- ループ波形は1周目と2周目で異なる波形を出力しうる。波形の終端で音量が大きく元に戻らない場合、波形終端をフェードアウトしたり、サンプルレートを上げたりすることで収束しやすくなるかもしれない。
- 変換前にLPFをかけておくと、波形が滑らかになってDPCM変換向きになる可能性がある(眉唾)
おまけ:LFO で音階利用の仕組み周り
本来、WAV9 の DPCM は指定するノートによって16段階の周波数で発音できます(周波数は表にもとづいていて、音程差は均等ではない)。LFO コマンドを使うとリアルタイムで再計算が必要になる都合により、周波数の計算が他の波形と同じような形になります。具体的にソースコードで言うと、普通は MOscFcDpcm.as の setNoteNo() で周波数が決まるところを、LFO が setFrequency() によって周波数を書き換えてしまいます。一般的な波形では o5a を 440 Hz で再生しますが、setFrequency() では値を16倍しているため、WAV9 では o5a が 7040 Hz で鳴ります。
LFO の内容は長さ0の三角波です。長さ0なので振動しません。仕様的に三角波の変位は0から開始ではないため、指定した音程の変化が即時に行われるわけです。
これがわかれば、あとはひたすらどのように高品質な波形を用意するかが問題だと思います。上記の通り気をつけなければいけないことが多々ありますが、がんばるしかないです。
何か素敵な技がありましたら、ぜひぜひおしえてください。 (ノヮ=*)
おまけ:DPCMのサンプル長
Bytes | Samples |
---|---|
$001 | 8 |
$011 | 136 |
$021 | 264 |
$031 | 392 |
$041 | 520 |
$051 | 648 |
$061 | 776 |
$071 | 904 |
$081 | 1032 |
$091 | 1160 |
$0A1 | 1288 |
$0B1 | 1416 |
$0C1 | 1544 |
$0D1 | 1672 |
$0E1 | 1800 |
$0F1 | 1928 |
$101 | 2056 |
$111 | 2184 |
$121 | 2312 |
$131 | 2440 |
$141 | 2568 |
$151 | 2696 |
$161 | 2824 |
$171 | 2952 |
$181 | 3080 |
$191 | 3208 |
$1A1 | 3336 |
$1B1 | 3464 |
$1C1 | 3592 |
$1D1 | 3720 |
$1E1 | 3848 |
$1F1 | 3976 |
$201 | 4104 |
$211 | 4232 |
$221 | 4360 |
$231 | 4488 |
$241 | 4616 |
$251 | 4744 |
$261 | 4872 |
$271 | 5000 |
$281 | 5128 |
$291 | 5256 |
$2A1 | 5384 |
$2B1 | 5512 |
$2C1 | 5640 |
$2D1 | 5768 |
$2E1 | 5896 |
$2F1 | 6024 |
$301 | 6152 |
$311 | 6280 |
$321 | 6408 |
$331 | 6536 |
$341 | 6664 |
$351 | 6792 |
$361 | 6920 |
$371 | 7048 |
$381 | 7176 |
$391 | 7304 |
$3A1 | 7432 |
$3B1 | 7560 |
$3C1 | 7688 |
$3D1 | 7816 |
$3E1 | 7944 |
$3F1 | 8072 |
$401 | 8200 |
$411 | 8328 |
$421 | 8456 |
$431 | 8584 |
$441 | 8712 |
$451 | 8840 |
$461 | 8968 |
$471 | 9096 |
$481 | 9224 |
$491 | 9352 |
$4A1 | 9480 |
$4B1 | 9608 |
$4C1 | 9736 |
$4D1 | 9864 |
$4E1 | 9992 |
$4F1 | 10120 |
$501 | 10248 |
$511 | 10376 |
$521 | 10504 |
$531 | 10632 |
$541 | 10760 |
$551 | 10888 |
$561 | 11016 |
$571 | 11144 |
$581 | 11272 |
$591 | 11400 |
$5A1 | 11528 |
$5B1 | 11656 |
$5C1 | 11784 |
$5D1 | 11912 |
$5E1 | 12040 |
$5F1 | 12168 |
$601 | 12296 |
$611 | 12424 |
$621 | 12552 |
$631 | 12680 |
$641 | 12808 |
$651 | 12936 |
$661 | 13064 |
$671 | 13192 |
$681 | 13320 |
$691 | 13448 |
$6A1 | 13576 |
$6B1 | 13704 |
$6C1 | 13832 |
$6D1 | 13960 |
$6E1 | 14088 |
$6F1 | 14216 |
$701 | 14344 |
$711 | 14472 |
$721 | 14600 |
$731 | 14728 |
$741 | 14856 |
$751 | 14984 |
$761 | 15112 |
$771 | 15240 |
$781 | 15368 |
$791 | 15496 |
$7A1 | 15624 |
$7B1 | 15752 |
$7C1 | 15880 |
$7D1 | 16008 |
$7E1 | 16136 |
$7F1 | 16264 |
$801 | 16392 |
$811 | 16520 |
$821 | 16648 |
$831 | 16776 |
$841 | 16904 |
$851 | 17032 |
$861 | 17160 |
$871 | 17288 |
$881 | 17416 |
$891 | 17544 |
$8A1 | 17672 |
$8B1 | 17800 |
$8C1 | 17928 |
$8D1 | 18056 |
$8E1 | 18184 |
$8F1 | 18312 |
$901 | 18440 |
$911 | 18568 |
$921 | 18696 |
$931 | 18824 |
$941 | 18952 |
$951 | 19080 |
$961 | 19208 |
$971 | 19336 |
$981 | 19464 |
$991 | 19592 |
$9A1 | 19720 |
$9B1 | 19848 |
$9C1 | 19976 |
$9D1 | 20104 |
$9E1 | 20232 |
$9F1 | 20360 |
$A01 | 20488 |
$A11 | 20616 |
$A21 | 20744 |
$A31 | 20872 |
$A41 | 21000 |
$A51 | 21128 |
$A61 | 21256 |
$A71 | 21384 |
$A81 | 21512 |
$A91 | 21640 |
$AA1 | 21768 |
$AB1 | 21896 |
$AC1 | 22024 |
$AD1 | 22152 |
$AE1 | 22280 |
$AF1 | 22408 |
$B01 | 22536 |
$B11 | 22664 |
$B21 | 22792 |
$B31 | 22920 |
$B41 | 23048 |
$B51 | 23176 |
$B61 | 23304 |
$B71 | 23432 |
$B81 | 23560 |
$B91 | 23688 |
$BA1 | 23816 |
$BB1 | 23944 |
$BC1 | 24072 |
$BD1 | 24200 |
$BE1 | 24328 |
$BF1 | 24456 |
$C01 | 24584 |
$C11 | 24712 |
$C21 | 24840 |
$C31 | 24968 |
$C41 | 25096 |
$C51 | 25224 |
$C61 | 25352 |
$C71 | 25480 |
$C81 | 25608 |
$C91 | 25736 |
$CA1 | 25864 |
$CB1 | 25992 |
$CC1 | 26120 |
$CD1 | 26248 |
$CE1 | 26376 |
$CF1 | 26504 |
$D01 | 26632 |
$D11 | 26760 |
$D21 | 26888 |
$D31 | 27016 |
$D41 | 27144 |
$D51 | 27272 |
$D61 | 27400 |
$D71 | 27528 |
$D81 | 27656 |
$D91 | 27784 |
$DA1 | 27912 |
$DB1 | 28040 |
$DC1 | 28168 |
$DD1 | 28296 |
$DE1 | 28424 |
$DF1 | 28552 |
$E01 | 28680 |
$E11 | 28808 |
$E21 | 28936 |
$E31 | 29064 |
$E41 | 29192 |
$E51 | 29320 |
$E61 | 29448 |
$E71 | 29576 |
$E81 | 29704 |
$E91 | 29832 |
$EA1 | 29960 |
$EB1 | 30088 |
$EC1 | 30216 |
$ED1 | 30344 |
$EE1 | 30472 |
$EF1 | 30600 |
$F01 | 30728 |
$F11 | 30856 |
$F21 | 30984 |
$F31 | 31112 |
$F41 | 31240 |
$F51 | 31368 |
$F61 | 31496 |
$F71 | 31624 |
$F81 | 31752 |
$F91 | 31880 |
$FA1 | 32008 |
$FB1 | 32136 |
$FC1 | 32264 |
$FD1 | 32392 |
$FE1 | 32520 |
$FF1 | 32648 |