- 小技
- シーケンスデータを再使用する
- キーオン後からキーオフまでの間に、音量やパンを設定する
- キーオン後からキーオフまでの間に、一度だけ音程を変化させる (890 様)
- キーオフせずにキーオンする (あまりお勧めできません)
- 音量変化コマンドを使用せずに音量を設定する (限定的)
小技
シーケンスデータを再使用する
ループと条件ジャンプを使用しある程度大きなデータを再使用可能にすることで、全体のサイズを小さくすることができます。
基本1 (メインのループ内に 00 - D1 が必要)
︙
E0 02 ;2 (L_ループ開始位置 に戻す) + 1 (F5)
L_ループ開始位置:
F5 01 L_再使用可能データ ;1 回目でジャンプ (カウントダウンカウンタ = 2)
XX ;キーオン・休符・タイ (00 - D1) が必要 (無い場合は無限ループで演奏停止)
F0 ;ループ終了 (カウントダウンカウンタ = 0)
︙
F1
L_再使用可能データ: ;ループを使用していないデータ
00 0F 1E 2D 3C 4B
5A 69 78 87 96
F0 ;L_ループ開始位置 に戻る (カウントダウンカウンタ = 1)
基本2 (メインのループ内データ不要)
︙
E0 02 ;2 (L_ループ開始位置 に戻す) + 1 (F5)
L_ループ開始位置:
F5 01 L_再使用可能データ ;1 回目でジャンプ (カウントダウンカウンタ = 2)
F0 ;ループ終了 (カウントダウンカウンタ = 0)
︙
F1
L_再使用可能データ: ;ループ終了 (F0) で終了するデータ
E0 01
00 0F 1E 2D 3C 4B
5A 69 78 87 96 A5
F0
[MM ...] ;キーオン・休符・タイ (00 - D1) 以外のコマンドは可
F0 ;L_ループ開始位置 に戻る (カウントダウンカウンタ = 1)
00 ;再使用可能データ内ループが終了するときに、この部分のデータをチェック (ドライバの仕様)
︙ ;内部処理時間を短くするには、L_ループ開始位置 に戻す F0 の直後に 00 - D1 を置くこと
再使用可能データの最後のキーオン・休符・タイをメインに置きたくない場合
︙
E0 02 ;2 (L_ループ開始位置 に戻す) + 1 (F5)
L_ループ開始位置:
F5 01 L_再使用可能データ ;1 回目でジャンプ (カウントダウンカウンタ = 2)
F0 ;ループ終了 (カウントダウンカウンタ = 0)
︙
F1
L_再使用可能データ: ;ループはしないが F0 で終了するデータ
E0 01 ;1 + 1 (F5)
F5 01 L_再使用可能データ_1 ;カウントダウンカウンタを減らすためのジャンプ (カウントダウンカウンタ = 1)
L_再使用可能データ_1:
00 0F 1E 2D 3C 4B
5A 69 78 87 96 A5
F0
[MM ...] ;キーオン・休符・タイ (00 - D1) 以外のコマンドは可
F0 ;L_ループ開始位置 に戻る (カウントダウンカウンタ = 1)
00 ;内部処理時間を短くするためのデータ
︙
再使用可能データの最後のキーオン・休符・タイをメインに置く必要がある場合
︙
E0 01 ;ループ1 (カウントダウンカウンタ1 = 2)
L_ループ1開始位置:
E0 02 ;2 (L_ループ2A開始位置 に戻す) + 1 (F5)
L_ループ2A開始位置:
F5 01 L_再使用可能データA ;1 回目でジャンプ (カウントダウンカウンタ2A = 2)
F0 ;ループ終了 (カウントダウンカウンタ2A = 0)
︙
00 ;ループ1 に戻るまでと ループ1 から“最初の F0”までに 音符・休符・タイ が
;存在しないので、ループ2B の F0 の前に キーオン・休符・タイ (00 - D1) が必要
;無い場合はこの音の次の キーオン・休符・タイ を探すことができず演奏停止
F5 02 L_ループ1の2回目はループ1の外 ;2 回目で ループ1 終了 (カウントダウンカウンタ1 = 2, 0)
E0 02 ;2 (L_ループ2B開始位置 に戻す) + 1 (F5)
L_ループ2B開始位置:
F5 01 L_再使用可能データB ;1 回目でジャンプ (カウントダウンカウンタ2B = 2)
XX ;再使用可能データB の最後の キーオン・休符・タイ
F0 ;ループ終了 (カウントダウンカウンタ2B = 0)
F0 ;L_ループ1開始位置 に戻る (カウントダウンカウンタ1 = 1)
L_ループ1の2回目はループ1の外:
︙
F1
L_再使用可能データA: ;ループ終了 (F0) で終了するデータ
E0 ...
F0
F0 ;L_ループ2A開始位置 に戻る (カウントダウンカウンタ2A = 1)
00 ;内部処理時間を短くするためのデータ
︙
L_再使用可能データB:
︙
F0 ;L_ループ2B開始位置 に戻る (カウントダウンカウンタ2B = 1)
00 ;内部処理時間を短くするためのデータ
︙
キーオン後からキーオフまでの間に音量やパンを設定する
通常はタイコマンドの直前の音量設定・パン設定は次のキーオンまで反映されませんが、処理時間 1 で変化させることで音量再計算フラグをオンにすることができます。
処理時間 1 で変化
︙
F2 00 00 40 ;音量 = 0x40
F3 00 00 60 ;パン = 0x60
87 ;ノートオン
F2 01 00 80 ;音量 = 0x80, 処理時間 = 0x0001
C3 ;タイ
F3 01 00 A0 ;パン = 0xA0, 処理時間 = 0x0001
C3 ;タイ
︙
キーオン後からキーオフまでの間に一度だけ音程を変化させる
処理時間が 1 のピッチスライドを使用することで、一度だけキーオフせずに音程を変化させることができます。
ピッチスライド
︙
D6 60 01 01 ;ピッチスライド : ディレイ = 0x60, 処理時間 = 0x01, 音程変化 = 0x01
87 ;ノートオン : 音長 = 0xC0 (0x60 ティック後に半音上がる)
E6 ;ピッチスライド解除
︙
キーオフせずにキーオンする
実際には処理されないタイをキーオンの前に置くことで、キーオフせずにキーオンすることができます。
キーオフを回避
︙
XX ;ノートオン (00 - B3)
;DE コマンドのディレイは XX と YY の音長の合計で計算される
E0 01 ;1 + 1 (F5)
F5 01 L_ノートオン ;1 回目でジャンプ (カウントダウンカウンタ = 1)
YY ;タイ (C3 - D1) をノートオンの前に置くことでキーオフを回避 (ドライバの仕様)
L_ノートオン:
9B ;00 - B3
F0 ;ループ終了 (カウントダウンカウンタ = 0)
︙
音量変化コマンドを使用せずに音量を設定する
特定のキーオン時の音量変化テーブルを選択することで、音量変化コマンドを使用せずに音量を設定することができます。
DC コマンドの音量倍率で F2 コマンドを使用せずにトラックの音量を設定する
︙
DC 0B ;音量倍率 0xFF (255)
00 ;ノートオン
DC 0D ;音量倍率 0xFF (255)
0F ;ノートオン
DC 14 ;音量倍率 0xD2 (210)
1E ;ノートオン
DC 15 ;音量倍率 0xAA (170)
2D ;ノートオン
DC 16 ;音量倍率 0x82 (130)
3C ;ノートオン
DC 17 ;音量倍率 0x5A (90)
4B ;ノートオン
DC 18 ;音量倍率 0x32 (50)
5A ;ノートオン
︙