![見出し画像](https://assets.st-note.com/production/uploads/images/119398971/rectangle_large_type_2_528ff073e2bd8b59676b7cfb10cddde3.png?width=1200)
AT2で曲作り:作った音を自分のプログラムに取り込む
前回までの記事でArkos Tracker2(AT2)で曲が作れるようになったと思います。今回の記事ではその曲を自分のプログラムに取り込む方法について説明します。と、とりあえず今回はサンプルコードもついてますのでそちらを先にゲットしてください
https://github.com/sailorman-msx/games/tree/main/src/at2study
サブソングをまとめたやつがファイルとして出力される
Song propertiesの一番上に表示されているSong Titleはいわば「アルバムのタイトル」です。アルバムの中にサブソング(曲)がたくさんある。というイメージですね。
![](https://assets.st-note.com/img/1697781191103-ZxhRyBjwxo.png?width=1200)
ソースファイルを出力するとこの「タイトル」のレベルで全てのソングデータを出力することができます。(もちろん、出力時に出力したいソングだけを選ぶことも可能です)
そのため、このSong Titleはできるだけわかりやすい名前をつけておくようにしましょう。
ExportではExport as generic(AKG)を選ぼう
前の記事でさらっと説明しているようにAT2ではいろんな形式のプレイヤーを持っていて、それぞれのプレイヤーにあわせた形式でExportする仕組みになっています。今回はAKGで出力します。
![](https://assets.st-note.com/img/1697781420745-iB5ScKRbB3.png?width=1200)
「Export as generic(AKG)」を選択すると次のような画面が出てきます。
![](https://assets.st-note.com/img/1697781507005-ayiGfXat0f.png?width=1200)
Export as のASM labels prefix がソングタイトルになっていることを確認しましょう。ここを変な文字列にするとあとで後悔します。
他は何も考えずにOKボタンをクリックしてください。
出力されたファイルを確認
エクスポートが行われると所定の場所に、次のようなファイルができあがります。
ソングタイトル名.asm
ソングタイトル名_playerconfig.asm
今回の例だと、TRAINING_BGM.asm、TRAINING_BGM_playerconfig.asmというファイルが出力されます。
RASMを使ってプレイヤーをアセンブルする
次に、rasmアセンブラを使ってプレイヤーをアセンブルする必要があります。アセンブル以降の手順は次のとおりです。
1. rasmアセンブルの対象なる設定ファイル(asm)を作成
2. rasmでアセンブルする
3. Disarkで逆アセンブルする
4. 逆アセンブルしたソースコードをarkos2z80asmで加工する
rasm (rasm.exe)にPATHは通っていますか?
Disark(Disark.exe)にPATHは通っていますか?
確認しましょう。
Disarkは以下のディレクトリにあります。
"Arkos Tracker2"/tools
エクスポートされたasmファイルが存在しているディレクトリに行き、以下のようにCompileAT2Files.asmというファイルを作成してください。
![](https://assets.st-note.com/img/1697781998837-yQP9yl5yN1.png?width=1200)
PLY_AKG_HARDWARE_MSX = 1 ← MSXの場合は必須
PLY_AKG_MANAGE_SOUND_EFFECTS = 1 ← SFXを使う場合は必須
PLY_AKG_Rom = 1 ← ROMにプレイヤーを埋め込む場合は必須
PLY_AKG_ROM_Buffer = #d900 (※)
AT2ではPLY_AKG_ROM_Bufferで指し示すアドレスから256バイトをワークエリアとして使います。今回の例だとD900Hからをワークエリアとして使う。という意味になります。
SFXを使う場合、エクスポートされたファイルと同じディレクトリにPlayerAkg_SoundEffect.asmというファイルが必要になります。
設定ファイルができたら、rasmでアセンブルします。
2024/02/01 追記
SFXを使う場合は、ワークエリアは300バイトくらいになることもあるようです。大きめに用意してきましょう。
![](https://assets.st-note.com/img/1697782390579-GYNEARMvqJ.png?width=1200)
rasm CompileAT2Files.asm -o CompileAT2Files -s -sl -sq
アセンブルに成功すると、CompileAT2Files.bin, CompileAT2Files.sym というファイルが出来上がります。
できあがったバイナリを逆アセンブルする
今度はZ80ASM用のソースファイルに逆アセンブルしていきます。AT2では逆アセンブルのツールとしてDisarkというツールが用意されています。
![](https://assets.st-note.com/img/1697782598734-CYdpsoPA3R.png?width=1200)
Disark CompileAT2Files.bin temp.asm --symbolFile CompileAT2Files.sym
逆アセンブルに成功すると temp.asm というファイルが出来上がります。
ですが、temp.asm は次のような構文になっていてZ88DKのZ80ASMでは構文エラーになっていまいます。
![](https://assets.st-note.com/img/1697782707826-ydSYzmHrom.png?width=1200)
そのため、筆者が作成したツールでZ80ASM形式のソースに変換しましょう。(このツールはPythonで出来てますのでWindowsでも使えるはずです)
![](https://assets.st-note.com/img/1697782781438-hwWxZEVTjh.png?width=1200)
./arkos2z80asm temp.asm > AKGPlay.asm
実行すると AKGPlay.asm というファイルが出来上がり次のようにZ80ASMの構文形式に加工されていることがわかります。
![](https://assets.st-note.com/img/1697782886083-7mgi81Tk9G.png?width=1200)
ここまでで、AKGPlay.asmというファイルにプレイヤーとソングデータがASM形式のソースとして出力できたことになります。
自分のプログラムに取り込む
最後にAKGPlayer.asmを自分のプログラム内にincludeしましょう。
こんな感じですね。
![](https://assets.st-note.com/img/1697783005688-Qrp21YDBHp.png?width=1200)
AT2で作成した音楽を鳴らす方法
次にAT2で作成した音楽を鳴らす方法です。
BGMの鳴らしかたは簡単です。最初にPLY_AKG_INITをCALLします。
HLレジスタにソングスタートアドレスのラベル(今回のサンプルだとTRAINING_BGM_START)を
Aレジスタにサブソング番号をそれぞれセットして呼び出します。
これでこの後に、PLY_AKG_PLAYが呼び出されると曲を再生します。
LD HL, XXXXX_START ; XXXXXはソングタイトル名
LD A, 0 ; Aレジスタにサブソング番号をセット
CALL PLY_AKG_INIT
CALL PLY_AKG_PLAY ; H.TIMI内で呼ぶ
これだけです!!
今回のサンプルではAT2で作成した曲をBGMにしたデモ用のプログラムを付けてます。
デモを動かすとわかるのですが、AT2で聴く音やリズムとプログラムで鳴らしたときの音やリズムとは絶妙に異なります。
自分で一番好きな音やリズムに変えたりして、より深くAT2を体験してくださいね。
at2study.asm というサンプルを置いてます。
LinuxやmacOSであれば
./z8make at2study 32768
とコマンドを打つと at2study.rom が出来上がります。
(bashなのでWindowsでは使えません。ごめんなさい)
![](https://assets.st-note.com/img/1697783424659-sQaSIxDXwB.png?width=1200)
AT2ではBGMは複数チャンネル、効果音(SFX)は1チャンネルで鳴らすのが王道のようです。次回は、AT2での効果音の作り方・使いかたとちょっとしたテクニックを紹介します。
では、また!ノシ
いいなと思ったら応援しよう!
![MSXのZ80で何か作る](https://assets.st-note.com/production/uploads/images/165443512/profile_71e620b4702dc58b8c67c13f72890394.jpeg?width=600&crop=1:1,smart)