ラベル 音楽 の投稿を表示しています。 すべての投稿を表示
ラベル 音楽 の投稿を表示しています。 すべての投稿を表示

2024年12月25日水曜日

今年の芸術方面の活動

今年はメタバースで18回DJやらせてもらいました。そのうち7回は海外イベント。

あとは随伴音楽。1つ目は大学の仲間と作った映像のBGM。


もう1つは課題で作った動画のBGMとSE。


あとは映像関係の勉強に伴い、VJ周りの環境も再構築中。自作のウェブベースのやつとTDをVDMXに繋げる形であれこれお試し中です。

ドラムは教室通いを続けてて、今YAMAHAのドラムのテキスト3冊目。会社のメンツと時々集まって演奏したりしてます。

2018年6月4日月曜日

沙羅曼蛇2用のサウンドデータ作成方法

興味持ってる人がいるようだったので、とりあえず手元でデータ生成に使ってるツール一式をまとめてみました。と言っても、データ生成はほぼほぼarm用のアセンブリでやってます。本来はm68k用を使うべきなんでしょうが、命令を吐く必要がないのでbig endianが指定できればなんでも良いのです。

ツール一式は前エントリのサンプルデータと共にGitHubにて。

data/ 以下にサンプルデータとデータ生成スクリプトが入ってます。スクリプトはPOSIX環境向けなのでWindowsの人はWSLなりCygwin、MinGWあたりを使って道具を揃えてもらえれば、と。とは言ってもpureなWindows環境向けに同等のツールを揃えることは、ある程度の知識があれば大きな手間はかからないと思います。

生成に使っている開発ツールですが、自分はmac上のbrewでarm-none-eabi-gccを使ってます。Ubuntuでもパッケージでさくっと入れられるかと思いますので、Windowsの人はWSLを使っていれば同様に簡単に環境が揃うかと。

data/gxsnd.S がサンプルデータなので中を覗いてみてください。gxsnd.hっていうヘッダの中で色々とコマンドを定義して、それを使ってアセンブリ言語向けのデータを埋めてく感じです。

先頭の.org 0x00108000はデータを配置するメモリ上のアドレスを表しており、この値はmame向けのテスト環境で前提にしている値です。サウンド用のサブCPU内のアドレスを表しており、このアドレスは沙羅曼蛇2では未使用のRAM領域です。実機で試したい場合には、既存のデータを上書きする形でROM内に配置する必要があります。また、その際にはROMチェックを通るようにチェックサムの辻褄を合わせる必要もあります。このあたりの解析情報も持ち合わせているのですが、今回はこの点については割愛。

続くHEAD:部は、全16チャンネルのデータ位置とデータ末尾を示すラベルで埋めます。この部分はいじらないで下さい。

続けてCH_1からCH_16まで、実際のデータが続きます。各チャンネルのデータは必ずENDで終わらせて下さい。またデータ末尾にも必ずENDが必要です。

データについてはMMLを知っていればある程度推測できる範囲にあるとは思うのですが、わかりにくい部分だけ補足します。

一般的なMMLでは音程と音長を組み合わせてA4などと指定するのが一般的です。またLコマンドで省略時の音長も指定でき、単純にAと書けばラの音が指定できます。一方、このシステムでは、音程に対して、音長、ゲートタイム、音量を合わせて指定するのが基本になります。A4LG(L4,100,127)と書くと、ラの音を100%のゲートタイム、音量最大127で指定する事になります。Aの後の4は音長ではなくオクターブです。また2音目以降はゲートタイム、または音長とゲートタイムを省略可能です。A4LGではなく、A4Lと書けばゲートタイムが省略、A4と書けば音長とゲートタイムが省略され、前回の値が再利用されます。ただし音量は必ず毎回指定する必要があります。この点が少し不便。音量は96が四分音符相当で最大255までしかとれません。よって直接指定するのは二分音符までとし、それより長い場合にはタイ(TIE)で繋いで下さい。タイも音長とゲートタイムを引数に取ります。音調に関しては直接数字で記述しても良いですし、gxsnd.hで定義されているL4などの文字を使っても構いません。付点はL4_などとアンダーバーで表現できます。

ドラムに関してはRHYTHM_ONでリズム音源モードというか。ノート毎に違うサンプリングデータがアサインされてるモードになります。C0からBb2まで、バスドラ数種、スネア数種、シンセタム、生タム、ハット、金物各種、色物系みたいな順で並んでます。そうそう、通常の音色もサンプリング番号+ADSRチックなエンベロープ個別指定になってます。よって沙羅曼蛇2をベースにする限り、沙羅曼蛇2のROMに入ってるサンプリング音色しか使えません。65音色くらいあったと思います。一応音色一覧的なのもあるけど主観で命名してるので環境手に入れたら自分の耳で確認してもらうほうが確か。

各コマンドの値に指定できる値は基本的には0-255の8-bitsの値になります。が、コマンドによって成約もあります。PANは1が左、8が中央、16が右でその間の値もとれます。REVERBは2つの引数ともに0-15までしか取れません。DETUNEに関してはsigned charで-128から127で考えて良いかと思います。

繰り返しについてはREPEAT_START / REPEAT_ENDで囲んで下さい。REPEAT_ENDの第1引数が繰り返し回数です。第2、第3については不明ですが、既知のデータでは0が指定されていました。

ループポイントについてはLOOPコマンドに続けて戻りたい場所のシンボル名を後続の.dc.lラインで指定して下さい。内部的な挙動はマクロ呼出しと同じですが、コマンドは別途アサインされていました。マクロについてはサンプルでは使っていませんが、CALLコマンドに続けて.dc.lでシンボルを指定すると、任意シンボル内のデータを演奏してから呼び出し元に再生位置が戻ります。これらのデータはDATA_ENDより手前、通常はCH_16の後ろに置かれ、他のデータ同様にENDで終了します。

再生環境についてはmameを流用するのが簡単です。とは言っても沙羅曼蛇2のROMを所有している必要がありますので、この点に関しては著作権遵守でお願いします。駿河屋で2万ちょっとが店頭での最安値かな?ヤフオクで見張ればもっと安く手に入ることもありますが、慣れてない人にはおすすめできません。基板環境ない人でもプラス数万払えば実機で演奏する環境も夢ではありませんよ。

mame/mame.diff のパッチをあててmameをbuildする必要があります。あるいはdebugモードで起動すれば本体に手を入れずともデバッガコマンドから再生する事は可能なのですが……実際にデータ作って〜となると面倒でやってられません。このパッチは特定アドレスにデータを読み込むフックをかけてます。実際には0x00800000を叩くとgxsnd.datというファイル名をメモリに読み、サウンドチェック用の曲ヘッダが指す先を読み込んだメモリ上のデータに差し替え、再生用のホストコマンドを入れて割り込みをあげます。

該当アドレスを叩くのはmame/cheat/salmndr2.xmlのcheatを通して行います。mame以下に「cheat 1」と書いたmame.iniファイルを置くとcheat以下の定義が読み込まれ、cheatメニューにLoad GXSND、BGM Test、Loop 1 BGMなどが追加されます。この中のLoad GXSNDを選ぶと該当アドレスが叩かれてデータの再生が始まるはずです。

BGM Test、Loop 1 BGMはおまけ。前者は曲を選んで再生できます。後者は1週目から2週目BGMを再生するハック。

ざっくりこんな感じで。何か質問があればTwitterなどで質問して頂ければ。あと、著作者からの要望があれば、前置きなく解析情報を削除することもあるかと思います。まぁ、68アセンブリ読めれば誰でも数時間でわかるような内容ではありますが。

ちなみにSilver Wings Againに使われているコマンドは0xd0以外は解析できてます。引数の数はコード見ればすぐにわかるんだけど、効果はROM書き換えながら耳で確かめたり、コード見たりでまちまち。0xd0に関しては聴覚上に違いがなかったような気もするけど、mameで確認してる関係上、きちんとエミュレートされてない部分で変化してる可能性も。他の曲でまだ未確認なコマンドだとフルタイムポルタメントとかもありそう。ROM内のサウンドデータを同ツールでbuild可能なソースに変換する解析ツールも作ってあるんだけど、コード適当だし、解析ツールについて権利者がどう思うかもわからないので、今の所公開は考えてません。

2018年6月3日日曜日

沙羅曼蛇2のサウンドドライバを攻略するの巻

とりあえず、ROMの指定アドレスからサウンドデータをデコードして、アセンブラから再びドライバが認識するデータに再コンパイルする環境を整えた。

で、実機でROM焼きながら曲作るわけにもいかないので、開発用環境としてmameをほげって、特定のアドレスを叩くとファイルからデータを読んでサウンド側のRAMに配置するような環境を用意した。実際にはcheat機能も使って、cheatメニューからLOADを選ぶと該当アドレスが叩かれ、続けてK056800経由でサウンド再生の命令が飛ぶようになってる。

現状で把握してるサウンドドライバ用の命令は以下の通り。

  • ノート(音長指定あり/なし、ゲート指定あり/なし、音量指定あり)
  • タイ
  • 休符
  • ドラムモード(ON/OFF)
  • 繰り返し制御
  • マクロ呼出し
  • パン指定
  • オートパン(指定した時間で2点間を移動)
  • 音色指定
  • テンポ指定(チャンネルごと)
  • アタックレート指定
  • ディケイ指定
  • リリースレート指定
  • デチューン指定
  • LFO
  • LFOオートメーション(深さの時間変化)
  • リバーブ(チャンネルごと)
  • ループ指定
ヘッダ情報とかマクロやループポイントは絶対アドレスで指定するので、ROM配置に合わせてデータをコンパイルしてやる必要がある。このあたり、開発環境がかなり原始的だった可能性あるなぁ……。MSX時代だとほぼほぼバイナリエディタみたいなので作曲してるっていう話もあったけど、それとMMLの中間くらい?自分はとりあえずアセンブリのマクロを使って読みやすくした状態でアセンブラかけてデータを作ってるけど。ノート毎に音量指定するのが結構面倒で、あとから音量変えるのも手間。MMLから専用コンパイラでアセンブラのソースに変換してた可能性が高いかな?



とりあえず簡単な曲を作って再生させてみた。実験の延長なので曲自体凝ったことはできてないけど。音色からなんとなく沙羅曼蛇2感みたいなのは伝わってくるかな。

FMPSGの新譜はSystem GXの実機でいきたいなぁ。

2018年5月24日木曜日

沙羅曼蛇2を2周目BGMでスタートするパッチ

なんとなく沙羅曼蛇2のサウンドCPU側のコードを眺めてました。ホストからのコマンド、初期化の手順、全体的なデータのレイアウトくらいはわかったので少しメモ。たぶん他のSystem GXも同じ系譜なんじゃないかと(ヤッホー!軽く見てみたけど、ほぼほぼ同じだった。未使用曲は等に目新しいモノはなくMagical Melodyだけだった)

ホストからのコマンド

K056800を経由して8-bits x 4のデータを受け取ります。割り込みあがったらデータを呼んでコマンドを解釈。最初のバイトが0xF0以上の時は初期化やメモリチェック、サウンドチェック用の曲の再生など、特殊な要求がアサインされてます。それ以外の場合、最初のバイトに曲番号、2バイト目にバンク番号を指定して演奏開始。BGMはバンク1に、SEはバンク2から6にアサインされてました(ただし沙羅曼蛇2だと4〜6は同一)。

特殊コマンドはディスパッチするとこまでは追いかけたけど個別の処理は全部は追ってませんが、わかりやすいのだと0xF0が基板のテストモードから入れるSOUND SCALE CHECK。内部的に[0x0E, 0x01, 0x00, 0x00]のコマンドに置き換えられてテスト用のシーケンスが再生されます。0xF9はワークエリアの初期化、0xFEは起動時のROM RAM CHECKで7C/S、9C/S(沙羅曼蛇2の場合)のチェックの実体です。本格的にサウンドプログラムにパッチあてる場合には、このコマンドが成功するように修正する必要がある。

データ構造

0x000067e4 から 4Bytes x 8 x 2のアドレステーブルがあります。前半の4Bytes x 8が1周目、後半の4Bytes x 8が2周目のBGM/SE情報で、それぞれがバンク0〜7に対応する情報を格納する構造体のアドレスです。

各バンクの情報を格納する構造体は、単純に楽曲情報ヘッダのアドレスの配列です。1周目のBGM用バンク1の場合

.dc.b $00,$00,$6a,$fc ; SILVER WINGS AGAIN (STAGE 1)
.dc.b $00,$00,$6b,$08 ; SENSATION (STAGE 2)
.dc.b $00,$00,$6b,$14 ; ALL IS VANITY (STAGE 3)
.dc.b $00,$00,$6b,$20 ; SERIOUS! SERIOUS! SERIOUS (STAGE 4)
.dc.b $00,$00,$6b,$2c ; SPEED (STAGE 5)
.dc.b $00,$00,$6b,$38 ; DEAR BLUE (STAGE 6)
.dc.b $00,$00,$6b,$44 ; DEAR BLUE (STAGE 6)
.dc.b $00,$00,$6c,$16 ; DEAR BLUE (STAGE 6)
.dc.b $00,$00,$6c,$28 ; THEME OF THE LIVING BODY BOSS (3, 5 STAGE BOSS)
.dc.b $00,$00,$6b,$c8 ; WHAT'S YOUR NAME (NAMING)
.dc.b $00,$00,$6b,$98 ; AND THEN ...... (GAME OVER)
.dc.b $00,$00,$6b,$a4 ; A THEME OF THE SALAMANDER2 (TITLE)
.dc.b $00,$00,$6b,$b0 ; BEGINING FROM THE ENDLESS (ENDING)
.dc.b $00,$00,$6b,$f8 ; SOUND SCALE CHECK
.dc.b $00,$00,$6b,$5c ; THEME OF THE MECHANICAL BOSS (2, 4, 6 STAGE BOSS)
.dc.b $00,$00,$6b,$68 ; THEME OF THE LIVING BODY BOSS (3, 5 STAGE BOSS)
.dc.b $00,$00,$6b,$c8 ; WHAT'S YOUR NAME (NAMING)
.dc.b $00,$00,$6b,$50 ; NO FUTURE
.dc.b $00,$00,$6b,$74 ; PRELUDE OF THE LAST BATTLE (LAST STAGE)
.dc.b $00,$00,$6c,$04 ; THEME OF THE GOREM (STAGE 1 BOSS)
.dc.b $00,$00,$6b,$d4 ; THEME OF THE GOREM (STAGE 1 BOSS)
.dc.b $00,$00,$6b,$80 ; GIGA'S RAGE (LAST BOSS)
.dc.b $00,$00,$6b,$bc ; ENDING - AM SHOW VER.
.dc.b $00,$00,$6b,$e0 ; NERVOUS BREAKDOWN
.dc.b $00,$00,$6b,$ec ; FIRE TRIPPER
.dc.b $ff,$ff,$ff,$ff ; [n/a]
.dc.b $ff,$ff,$ff,$ff ; [n/a]
.dc.b $00,$00,$00,$00 ; [null]

こんな順に並んでました。ホストからのコマンドで最初のバイトで指定する順です。CD等に収録されてる未収録曲もばっちりアサインされてます(が、YOU TAKAMINE版のThunderboltは見つからず)。2周目用テーブルでは1面、4面、5面の箇所に別アドレスが入っており、POWER OF ANGER、LAST EXIT、PLANET PATISを指してます。同じ曲が複数入っているのは使い分けよくわかってないんだけど、曲番号に応じて特殊な初期化が走るコードを見かけたので、たぶん状況によって曲がうまく切り替わらない時があって、その時はワークアラウンド的に強制初期化+再生が無理やり走るような仕組みになってる気がする。

各楽曲情報を示すアドレスは、12Bytesだったかの構造体になっていて、なんらかのフラグ情報とシーケンスデータのアドレスを含んでる模様。この先はまだ調べてないけど、シーケンスデータもそのうち調べたい、というか沙羅曼蛇2音源で好き勝手演奏させたい(その後の調査でだいたい理解できた。基本演奏と音色、LFO、パンくらいは好き勝手できるようになったので簡単な曲くらいは作れそう)

ワークエリア

RAMの先頭(0x00100000)からいきなりチャンネルごとのワークが並んでいるっぽい。各チャンネル512Bytesで16チャンネル分。詳細はシーケンスフォーマットの調査と合わせていずれ。

1周目と2周目のBGMを入れ替えるパッチ

一番最初のテーブルで入れ替えちゃうのが楽です。7CのROMに対して以下の2Bytesを書き換えればOK。

0x000033f5 : 0xc4 => 0x54
0x00003405 : 0x54 => 0xc4

この入れ替えだったら起動時のチェックも素通りできます。

一応、mame用のcheatも紹介しておくとこんな感じ。
<mamecheat version="1">
  <cheat desc="Loop 1 BGM">
    <parameter>
      <item value="0xc4">Loop 1</item>
      <item value="0x54">Loop 2</item>
    </parameter>
    <script state="run">
      <action>soundcpu.rb@67EB=param</action>
    </script>
  </cheat>
</mamecheat>

2018年2月27日火曜日

楽曲作家探検

音楽を参加アーティストで辿れると面白いのに、そういうサービスって出てこない。っていうか、情報が残ってないんでしょうね。スタジオミュージシャン自身、自分が参加してる楽曲を把握しきれてなかったりするようですし。

なので、たまに今まで好きだった曲を作家で辿ってみたりすると楽しかったり。でもまぁ、結局はスタジオミュージシャンまでは滅多に追えないので作曲、作詞、編曲で追うくらいしかできないんですけど。で、まぁ、そんなのを記録に残しておけば、誰か反応してくれたり、未来の自分が喜んだりするかな、って事で雑談メモ的なのも残してみる事に。

という事で、今回は某田村ゆかりさんがライブでカバーしてた高橋由美子さんのGood Loveが起点。Tenderly TOUR '94のLDで歌ってたのでTenderlyのアルバム曲かと思ってたんだけど普通にドラマ主題歌のシングルだった。ドラマ見ない人だったからなー。というか今気づいたけど、このツアー、アルバムの曲あんまり歌ってない(笑)

で、高橋由美子さんで好きな曲を上から順にいくつか調査。

  • 3年過ぎた頃には
    • 作詞が白峰美津子さん。白峰さんと言えば個人的ベストはribbonのVirgin Snow。そしてVirgin Snowの作曲は松浦有希さんなんですよね。この時、松浦さん21歳、若い。白峰さんは名曲多いわりに個人情報あまり出てこなくて正体不明。80年代から作品出てるのでもう1世代前からいる人かとは思うんだけど。田村さん関係だとブラックダリアとか。
  • コートダジュールで逢いましょう
    • ふぅ、作詞は秋元康さん。この人はいつの時代にも物凄い頻度で出現する魔王。収録アルバムのParadiseは他にも後藤次利さん、及川眠子さん、筒美京平さんとか強すぎる布陣。
  • 笑顔の魔法
    • 川井憲次さんっぽい音使ってるけど、根岸貴幸さんだった。根岸さん今までノーマーク。
  • Good Love
    • 作詞の柚木美祐さん、笑顔に会いたいの人ですよ。編曲の岩本正樹さんはBaby's Breath、9月の扉、Bon Voyage!とかキングレコード系に繋がる。なるほど、岩本さんの曲は結構個人的お気に入りに入ってるな。
  • 友達でいいから
    • TAMTAM、初仕事で37.5万枚売ったのに、ほぼほぼ一発屋になってしまった。南くんの恋人抜きにしても良い曲だったと思うけど…。
で、今までノーマークだった根岸貴幸さん掘り下げ
  • Fight!(編曲)- 他の高橋由美子さんの曲は定額制にあるんだけど、これだけ無い!
  • コンディション・グリーン(編曲)
  • もっと!モット!ときめき(編曲)
  • 教えてMr.Sky(編曲)
なるほど。この辺は一度了解すればわかる。「全部同じじゃないですか!」
  • 初恋はかなわない(編曲)
岡崎律子さんとのコラボあったー。普段より昭和感たっぷり。

しかし、アニメ関係はもっぱら定額制サービスに無くて、あってもアニュータだけとか。すごく面倒。

あと、当時から曲は若手に書かせても作詞は実績のある人、みたいな風潮あったんですかね。西脇辰弥さんがribbonの編曲をメインで担当してた頃も20代半ばだったと思うし。わりと今活躍してる人達は20代から大きな仕事してる。もちろん消えていった人も多い。作曲家・編曲家が入れ替わり激しいのに比べ、作詞家は少数で長命な印象だなぁ。