PSG音テスト

Table of Contents

1 なんすか?これ?

なんとなくWindowsAPIでPCMをいじって音を出していたら面白くなって遊んでみたものです。 自前MML(Music Macro Language) を読み込んで初代ファミコンなどで使用されている PSG(Programable Sound Generator)風の音で演奏します。 お遊びで作ったものなので、大した物ではありません(^^;

2 遊び方

動作確認はWindowsXP SP3と Windows7 SP1 64bit で行いました。W系APIを使用していますのでWindows98 とかでは動かないかも。以下の7zipファイルを適当なディレクトリに展開します。

ファイルエクスプローラーなどから PSGtest.exe を実行するだけです。 「File → MML Open」でファイル選択ダイアログが開きますので、 7zファイルに同梱されている bigcore.mml やxevious.mml を選ぶと 演奏が始まります。演奏時間はプログラムで固定になっている為、 60秒で勝手に停止します。

MMLファイルを書けば他の曲も演奏できます。MMLは方言が多数ありますが どれかに準拠しているという訳では無いです。って更に方言を増やしてどうする(^^;

「きらきら星」を例にして、おおよその文法を説明します。

1   t110 v40 L8 Q7 O3       ccggaag4 ffeeddc4 ggffeed4 ggffeed4 ccggaag4 ffeeddc4
  • トラック

    行頭のワードです。例では「1」ですが、基本的に何でも構いません。以前の行で同じトラックが出てくる場合は、 そのトラックの続きとして解釈されます。初めて指定されたトラックの場合は、同時発音トラックとして解釈されます。

  • テンポ

    t??? でテンポを指定します。???は数値です。数値が大きいとテンポが速くなり、小さいと遅くなります。

  • ボリューム

    v??? で音量(ベロシティとも言うらしい?)を指定します。範囲は0〜255です。大きいほど音量が大きくなります。

  • 省略時音長

    l??? で省略時の音長を指定します。 2,4,8,16 など音符の長さで指定します。

  • ゲートタイム

    q???でゲート時間を指定します。範囲は0〜8です。音長の q/8 の長さで発音されます。 q=8だと音の切れ目が無くなります。

  • オクターブ

    o???でオクターブを指定します。範囲は0〜8です。大きいほどオクターブが高くなります。

  • 音階

    CDEFGAB、R で指定します。続けて音長を後ろに示します。以下に例を示します。

    • 4分音符のド         : C4
    • 8分音符のラのシャープ    : A+8
    • 付点16分音符のレのフラット : D-16.
    • 32分休符          : R32

    音長の数値を省略した場合は、L???で指定される「省略時音長」の長さになります。

  • オクターブの上げ下げ

    >、< で現在のオクターブから、1オクターブ上げ/下げ操作を行います。

  • 繰り返し

    [〜]? で指定します。[,]で囲まれた範囲を?回繰り返します。以下に例を示します。

    [abcd]2 は abcdを二回繰り返した abcdabcd と同じ。

    [[abc>]2]3 は abc> を二回繰り返した abc>abc>を更に三回繰り返した abc>abc>abc>abc>abc>abc> と同じ。

文法チェックは行っていませんので、変な指定をすると変な音が鳴ったり、エラーこい て落ちるかも知れませんが、そういうものだという事で。

3 プログラムソース

D言語(2.0)で書かれています。

Windows API プロジェクトのWinAPIバインディングを少し手を入れて利用させていただいています。 D言語はコンパイラバージョンが変わると、すぐにコンパイルが通らなくなりますので、 現時点でコンパイルできるセットをwin32-r391c.tar.xzとして勝手に固めさせてもらいました。 そんな訳で、Windowsでしか動きません(^^;

コンパイラは2012/12時点でgithubでメンテされている GDC を使用しました。 ただし、メインラインのtrunkはMinGW向けにビルドできません。 このため、MinGW向けに venix1さんがforkしているDMD2.060対応されたバージョンに少し手を入れて 使用しています(ビルドの参考)。

$ gdc -v
Using built-in specs.
COLLECT_GCC=C:\MinGW\gdc031_2060_463\bin\gdc.exe
COLLECT_LTO_WRAPPER=c:/mingw/gdc031_2060_463/bin/../libexec/gcc/mingw32/4.6.3/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.3/configure --build=mingw32 --with-arch=i686 --enable-languages=c,d --prefix=/mingw/gdc031_2060_463 --enable-threads --enable-fully-dynamic-string --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-nls --disable-win32-registry --disable-symvers --disable-werror --enable-sjlj-exceptions --with-bugurl=https://bitbucket.org/goshawk/gdc/issue --disable-bootstrap --disable-shared --disable-libgomp --disable-libmudflap
Thread model: win32
gcc version 4.6.3 (GCC)

ビルド方法は以下の通り。~/download/ の下にtar.xzアーカイブをダウンロードしたとします。 作業ディレクトリは適当な場所だとします。

  1. xz -dc ~/download/PSGtest_v001_src.tar.xz | tar xvf -
  2. cd PSGtest_v001_src
  3. xz -dc ~/download/win32-r391c.tar.xz | tar xvf -
  4. ./mk.sh -a

どちらかと言うとコンパイル環境を整えるのにかなり手間がかかりますが、それをいとわないという方 ならば適当に改造するなどして遊んでみてください。

4 その他

音の事はさっぱりな人が勢いで作ったものなので、バージョンアップなどは期待しないでください(^^;

5 履歴

  2008/05/25 : 初版
  2012/03/23 : ページをEmacsのorg-modeを使用して生成してみた。内容は2008/05/25と同じです。
  2012/12/23 : v001改版。ソースコードの改版がメインです。

TOP PREV

Author: TANE

Org version 7.8.11 with Emacs version 22