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

ごちゃログぴこっ

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

ピコカキコ - WAV9で音階付きメロディ楽器を鳴らす方法・ポイント・仕組み

このピコカキコを聴くと、ストリングスの音が綺麗になっています。音階が必要なサンプル波形がどうしてこのように鳴らせるのでしょうか?

FlMMLDPCMLFO をかけると、通常のメロディ波形のように音程が取れるようになります。波形のループも可能です。上記MMLではこの技を使っています。

DPCM 楽器の具体的な使い方

  1. DPCM Converter などで音色の定義を作成(FamiTracker など他のツールでも可、DPCMの制約については後述の「ループ波形を作成する際の注意」も参照)
  2. 音色指定時に下記のように @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

*1:DACは7bitだが、波形の変動は下位1bitを無視した6bitの範囲で行うのが正しい。しかし、arche さんのコンバータは単なる7bitで扱っているため、内部で想定する波形がまったく異なってしまう。