見出し画像

AT2で曲作り:AT2で効果音を鳴らす

今回でArkos Tracker2(AT2)での音づくりの連載は最終回となります。
ま、とりあえずサンプルをゲットするところからはじめましょう。
https://github.com/sailorman-msx/games/tree/main/src/at2study2

AT2での効果音の位置付け

AT2では効果音(SoundEffect, SFX)はAKGPlayer本体ではなくAKGPlayer_SoundEffectというやつで分割されています。理由はよくわかりませんがそのほうが良いみたいなことがWebサイトには書いてありました(汗)
そのため効果音を作るときは曲(ソング)を作るのとは少し毛色が違う作り方になっています。

自分でいちから作ろうとしない:まずはサンプルから

AT2でのSFXは単音が基本です。1chということですね。
つまりINSTRUMENTで作成する。というのが基本のようです。
Webサイトでは自分でいちから作ろうとせず、まずはサンプルのSFXを使って慣れるように。みたいなことが書かれてあります。
AT2のFile -> Open Songs でサンプルに同梱されていたSoundEffects.aksを開きましょう。

ファイルを開くと以下のような画面が表示されます。
左ペインにはINSTRUMENTSのサンプル、Patternパネルにはサンプルとして「この効果音はこんなおとだよ」というのが並んでいます。

サンプルではINSTRUMENT5個しかありません。もちろん自分で追加することもできますが、まずはサンプルのままで説明を続けます。

効果音をエクスポートする

とりあえず、INSTRUMENT番号01と02をサンプルとしてエクスポートしてみます。File -> Export -> Export sound effects (AKX)を選択します。

次にExportを実施します。今回は01と02とINSTRUMENTだけエクスポートしたいのでそれらだけにチェックして、他のINSTRUMENTのチェックは外します。

注意してほしいのは「ASM labels prefix」です。ここは空欄にしてください。あとで面倒になるためです。
と。ここまで設定したら「Export」をクリック。

好きな名前をつけて「Save」しましょう。
Saveすると、効果音のasmファイルとplayerconfigのasmファイルが作成されます。

SFXのアセンブリソースをアセンブルする

効果音のASMソースが追加されるため、Rasmでコンパイルするための設定ファイルを書き換えます。今回のサンプルでは前回のサンプルに追加する形で作成しています。

TRAINING_SFXを追加してます

あとは、前回記事同様に、Rasm -> Disark -> arkos2z80asm でZ80ASM用のソースを生成させてください。

SFXを自分のソースで鳴らすには

基本は2つ。ひとつは初期化です。前回記事で追加したコードのすぐ下あたりにPLY_AKG_INITSOUNDEFFECTSを呼び出すコードを追加します。
前述した「面倒になる」というのは、SOUNDEFFECTSのPrefixにその文字が入ってしまいます。気にならなければそれでも構いません。

(at2study2.asm抜粋)
    
    ; 画面書き換え可能フラグの初期化
    xor a
    ld (PATTERNNAMETB_REDRAW), a

    ; AKG Playerの初期化
    ld hl, TRAINING_BGM_START
    xor a
    call PLY_AKG_INIT

    ; AKG Sound Effectの初期化
    ld hl, SOUNDEFFECTS ; これを追加(エクスポート時のPrefixを空欄にしないとも少し長いサブルーチン名になります)
    call PLY_AKG_INITSOUNDEFFECTS ; これを追加

もうひとつは実際に効果音を鳴らすコードです。
効果音を鳴らす場合は、PLY_AKG_PLAYSOUNDEFFECTを呼び出します。
今回のサンプルではZキー、Xキーを押されたらそれぞれに該当する効果音を鳴らしています。

(at2study2.asm抜粋)

REDRAW_SCREEN:

    ; キー入力を受け付ける
    call KILBUF
    ld a, 5
    call SNSMAT

    ; Zキーが押された?
    cp 01111111B
    jr z, PUSHZKEY

    ; Xキーが押された?
    cp 11011111B
    jr z, PUSHXKEY

    jr REDRAW_PROC

PUSHZKEY:

    ; 効果音を鳴らす
    ld a, $01 ; SOUND EFFECT NUMBER
    ld c, 2   ; CHANNEL ( 0:1ch 1:2ch 2:3ch )
    ld b, 0   ; VOLUME ( 0 - 16 : 0=Full Volume)
    call PLY_AKG_PLAYSOUNDEFFECT

    jr REDRAW_PROC

PUSHXKEY:

    ; 効果音を鳴らす
    ld a, $02 ; SOUND EFFECT NUMBER
    ld c, 2   ; CHANNEL ( 0 - 2 )
    ld b, 0   ; VOLUME ( 0 - 16 : 0=Full Volume)
    call PLY_AKG_PLAYSOUNDEFFECT

REDRAW_PROC:

PLY_AKG_PLAYSOUNDEFFECTはAKGPlayerに対して「効果音を鳴らしてね」というトリガをONにしているだけでこのタイミングで音が鳴るわけではないことに注意してください。

ソングとSFXの違い

ソングはソング番号01はASM上では00になりますが、SFXの場合、INSTRUMENT番号01はASM上でも01のままです。ややこしいですが、間違えないようにしてください。ソングは複数チャンネルを使いますが、SFXは単音で1chのみとなります。
またソングはPatternパネル上のEVという欄に値(例えば1など)を入力するとその音がなったときに、PLY_AKG_ENENTという変数にその値がセットされるようになっていて、曲の終わりを判断したい場合などでその変数を使えるようになっていますが、SFXでは使えません。

INSTRUMENTで「ぽわわーん」とか「どかん!」とか「ぴろぴろ」みたいな音色を作ってそれを効果音とする。というのがAT2でのセオリーですね。

そして効果音を鳴らすときは「BGMを1chと2chで構成して、効果音は3chで鳴らす」というのがベターな鳴らし方だと思います。
AT2で聞く音とMSXで聴く音がだいぶ違う場合が多々あるので何度も繰り返し調整する必要があります。

    こんな感じで曲の終わりなどの判断に使える(Songのみ)
    ゲームオーバーの曲が演奏し終えてからゲームオーバーの処理にうつる。とか
    そういうときに使います。

    ; Wait for the AKG_EVENT#01
    ld a, (PLY_AKG_EVENT)
    cp 1
    jp nz, GameOverProcEnd

まとめ

今回の記事でArkos Tracker2の連載は終わりです。
最初は難しそうに感じるかもしれませんが、慣れるとかなり便利です。
みなさんのMSXでのマシン語プログラミングがはかどることを願っています。

では、また!ノシ

筆者近況

MSX0で遊ぶ前に、いま作ってるゲームを完成させなければと思っています。
かなりそれっぽくなってきました。
頑張って最後の仕上げをやりたいと思います。


セーラー服が似合うおじさんです。猫好き、酒好き、ガジェット好き、楽しいことならなんでも好き。そんな「好き」をつらつらと書き留めていきます。