実際のプログラミングで最初に着手したのはサウンドドライバでした。これは昔、サウンドを最後に組み込んだところ、ある程度ゲームが出来た後でサウンドを組み込んだら、CPUパワーを一気に20%近くも持っていかれて、ゲームが全体にもっさりして大変な目にあっという反省から、以後はサウンドドライバから作るようにしています。
そして、発音周波数の値を入れたらその音程が鳴るわけでは無く、なにかしらの計算を元にした値を入れないと目的の音は出ず、おまけに私は作曲の能力は無いときました。これは困ったです。っていうか、当時の私はどうやって音程を決めてたのか。困った、困りまくりました。
まずトレロモはないものは仕方が無いので、ON/OFF を高速に切り替えて、なんとなくトレモロっぽい効果を出す事にしました。また、当時は Twitter をしていたので、音程周波数の出し方が分からないと嘆いていたところ、フォロワーさんから音程計算式を教えて頂きました。
そして、これが一番大きかったのですが、私は音楽は作れないので誰か助けてーとツイートしたところ、プリンセスメーカーの作曲で有名な梶原正裕さんが「私が作りますよー」と手を上げてくださった事です。これは本当に大きかったです。流石に心の中でおお!ってガッツポーズ😁
プリンセスメーカー ©1991 GAINAX Co., Ltd.
梶原さんは独自のドライバ仕様 PMDMML を持っておられて、その仕様に似たような MML にしてほしいと依頼されました。その内容とは…
※ 以下、意訳も入ります。
え、ええ、えええええーっと💦💦💦 まず、いきなりの3連符必須に頭を抱えました。3連符対応のためには、音長カウンタ値は 3 で割り切れる数値にしないといけないのです。これに当然のように付点指定が入ります。付点とは、簡単に言うと音長のカウンタ値を3倍して2で割った長さにする事です。そう、意外と音楽の世界では 3 という数にまつわる処理が多いのです。そして当然、Z80 はこの 3 に関連する処理は苦手だったりします。
そのため、カウンタ値の設定はかなり限られてくるのに、次のご要望が L1 のTick値(カウンタ値)を曲毎に変更したいときました。うはあ、こうなると MMLコンバータで正しく割り切れない指定が来たらエラーを出すとかして、ある程度自由に L1長さを変更可能にしないといけない。だが、それ以上に問題があって、既に完成していたサウンドドライバは、以下の問題を抱えていたのです。
※ 先日、日焼け止めを塗らずにウォーキングして酷い目に遭いました…
そこでドット打ちが上手そうな人が居ないかと、Twitter で探索したところ、この絵が目に入ったのです。
まほわら ©2018 ボマーン
このスクショは当時の PC-8001 の新作ゲームで、まほわら ver0.9 です。制作者はボマーンさん。まさかこの時代に私以外にこんな馬鹿がいたとはwww ※ 褒め言葉です
- サウンド
そして、発音周波数の値を入れたらその音程が鳴るわけでは無く、なにかしらの計算を元にした値を入れないと目的の音は出ず、おまけに私は作曲の能力は無いときました。これは困ったです。っていうか、当時の私はどうやって音程を決めてたのか。困った、困りまくりました。
まずトレロモはないものは仕方が無いので、ON/OFF を高速に切り替えて、なんとなくトレモロっぽい効果を出す事にしました。また、当時は Twitter をしていたので、音程周波数の出し方が分からないと嘆いていたところ、フォロワーさんから音程計算式を教えて頂きました。
そして、これが一番大きかったのですが、私は音楽は作れないので誰か助けてーとツイートしたところ、プリンセスメーカーの作曲で有名な梶原正裕さんが「私が作りますよー」と手を上げてくださった事です。これは本当に大きかったです。流石に心の中でおお!ってガッツポーズ😁
プリンセスメーカー ©1991 GAINAX Co., Ltd.
梶原さんは独自のドライバ仕様 PMDMML を持っておられて、その仕様に似たような MML にしてほしいと依頼されました。その内容とは…
※ 以下、意訳も入ります。
- 3連符対応は必須だよー
- L1のTick値を曲毎に変えたいなー
- デチューンが欲しいよー
- ループは2重まで使いたいなー
- その他音楽的におかしいところは直してね♪
そのため、カウンタ値の設定はかなり限られてくるのに、次のご要望が L1 のTick値(カウンタ値)を曲毎に変更したいときました。うはあ、こうなると MMLコンバータで正しく割り切れない指定が来たらエラーを出すとかして、ある程度自由に L1長さを変更可能にしないといけない。だが、それ以上に問題があって、既に完成していたサウンドドライバは、以下の問題を抱えていたのです。
- 1曲毎独立設計なのでゲームに組み込みづらい ※致命的問題ですね…
- 効果音chを後付けしたため構造に無理が
- 疑似2ch再生を後付けしたため構造に無理が
- IXreg多用したため処理速度が遅い
- ドライバサイズが1KB食っていた ※それでも小さいのですが
- 無理やりトレモロみたいな使わない機能が付いていた ※ 頑張って実装したのですが要らないそうで
※ 先日、日焼け止めを塗らずにウォーキングして酷い目に遭いました…
- サウンドドライバ v2 新規作成
- データのさらなる高圧縮
- 梶原さんの要求仕様は全て盛り込む
- その上で出来ればエディタ上で仮演奏させる
- MML処理部と発音部を完全に切り離す
- 毎回呼び出される処理なのでもっと高速化
- ずっとメモリに常駐するのでもっと省メモリ
むちゃくちゃですよね…。でも、これの実現無くして先に進む事は出来ないと一念発起。上記目標を達成するために仕様切りから始めました。そして策定した仕様は大まかに以下の通りです。
開発着手したのですが、一度作っていて要領が分かっていたためか、V1作成時は数ヶ月かかっていたドライバが、エディタとドライバ含めて 2週間で出来てしまいました。この超高速開発の裏には、梶原さんの的確なバグ報告の賜でもありました。ご自身もドライバ作成されているので、内部構造的な指摘も多数頂き、殆どのバグは瞬殺(修正に1分かからないとか)出来たのは大きかったです。
さて、どこまで当初目標を達成出来たでしょうか。
- 音階データは可変長としてよく使うデータは1バイトに収める
- ビブラートは所詮8253なので単純な三角波のみとする ※高速化のため
- デチューンは深さ3bitまでとして掛け算を最大シフト3回まで ※高速化のため
- MML解析部は IX を使うが処理部では使わない
- ワークは全て256境界内に入っている前提
さて、どこまで当初目標を達成出来たでしょうか。
- データのさらなる高圧縮 OK!!
- 梶原さんの要求仕様は全て盛り込む OK!!
- その上で出来ればエディタ上で仮演奏させたい OK!!
- MML処理部と発音部を完全に切り離す OK!!
- 毎回呼び出される処理なので可能な限り高速化 OK!!
- ずっとメモリに常駐するので可能な限り省メモリ OK!! - 0.8KB
- 原画デザイン
そこでドット打ちが上手そうな人が居ないかと、Twitter で探索したところ、この絵が目に入ったのです。
まほわら ©2018 ボマーン
このスクショは当時の PC-8001 の新作ゲームで、まほわら ver0.9 です。制作者はボマーンさん。まさかこの時代に私以外にこんな馬鹿がいたとはwww ※ 褒め言葉です
素晴らしい!!
PC-8001でゲーム作ってて、アトリビュート理解してて、しかも本職が漫画家!ボマーンさん凄い!!この人しかいないとオファーしたらあっさり快諾!あとで聞いたら、私しか居ないんだろうなーと声が掛かった時点で覚悟されていたそうな💦
彼が作ったドット絵がこちらです。
本当に素晴らしいですよね!その後、ボマーンさんが本業の執筆で忙しくなったため、ボマーンさんが手招きして引き込んだのがしおQさんでした。これで開発カルテット揃踏みです!
Newシティヒーローメイキング・インデックス
※ ボマーンさんの数多いタイトルから季節柄こちらをチョイス。贔屓目なしで面白いので是非ご一読ください!
彼が作ったドット絵がこちらです。
本当に素晴らしいですよね!その後、ボマーンさんが本業の執筆で忙しくなったため、ボマーンさんが手招きして引き込んだのがしおQさんでした。これで開発カルテット揃踏みです!
Newシティヒーローメイキング・インデックス
コメント