Craptuneの実装の話
※書きかけです!
内部的には8bit/44100Hzモノラル固定です。そのため、音量を大きくしすぎると音割れが発生します!
目安としては、(vによる音量指定)×(@@や@によってかかっているエフェクタの音量倍率)×(同時発音数)±(丸めの誤差)が 127を超えてしまうと、8bitの限界を超えた音が発生してしまいます。特にライブラリ側で制限などはかけていませんので、音量指定は適切に行って下さい。
波形生成の実装
Waveformは1周期分の波形を生成します
そして、基本的には音量やピッチや再生波形が一定である区間を一周期分の波形を何度も繰り返しコピペして埋めます
(以下コピペとか言ってるものは全て波形加算です。サンプルごとにただの足し算を行うので和音も鳴らせます)
Waveformの中身 |_-"-|
|_-""-|
|_--""-|
(まだ要求されてない分は生成しない)
|__--""--|
|__--"""--|
コピペしたい波長 |vvvv|
コピペする領域 |vvvv|vvvv|vvvv|vvvv|vvvv|v|
コピペ結果 |_-"-|_-"-|_-"-|_-"-|_-"-|_|
また、実際は端数が出るんですが、下の図のように丸めてます
実際のコピペ領域 |vvvv|vvvvv|vvvv|vvvv|vvvvv|v| 実際のコピペ結果 |_-"-|_-""-|_-"-|_-"-|_-""-|_|
エフェクタの実装
| ベースエフェクタ | エフェクタスタック | エフェクタスタック | ... |
エフェクタリストが空の場合は、Waveformの波形がそのままコピペされます
エフェクタリストにWaveformが入っている場合、コピペするWaveformを別のものにします
エフェクタリストにEffectorが入っている場合、そのEffectorによる音量やピッチなどの再生パラメータの変更が行われます
それと共に、次に再生パラメータが変更される時間が計算されます
エフェクタリストに複数のEffectorやWaveformが載っている場合、それらが最初から順に適用され、 次にどれかのEffectorによって再生パラメータが変更されるまでの間、Waveformからの波形のコピペが行われます
ベース波形 |vvvvvvvvvvvvvvvvvvvvvvvvvv| adsr | | | | | vibrato | | | | | | | | コピペ単位 |v|vvv|vv|vv|vvvvv|vvvvv|vv|
再生パラメータの変化のタイミングによっては周期の途中からコピペを始めなければならない事がありますが、その際は位相を保存します
結果、再生パラメータが変化するタイミングでちゃんと音量が変化したように聞こえます
