Skip to content

Posts

MML仕様

それなりになってきたので、文法的なところもちゃんと決めていきたい。

MMLの標準化がされていないのは前に調べた通りなので、仕方ない。

記号意味備考
cdefgab音階
+, #半音上げ音階の直後に書く
-半音下げ音階の直後に書く
.符点
^タイ
r休符
l省略時音長
oオクターブ
>1オクターブ上げ
<1オクターブ下げ
vベロシティ0~127
@音色1~128
$チャンネル1~16
tテンポ1~960
pパンポット0~64~127
[]繰り返し
{}和音

こんな感じかな。

Read more

mdmml

SMFのこと何もわかっていなかった。

2トラック目の音が出ないのは、1トラック目のlength指定が間違っていたせい。

音色が変わらないのは、プログラムチェンジだけ書いてMSB/LSBがなかったせい。

とりあえず形になってきた。

参考ページ:

mdmml

とりあえず Timidity で再生できるSMFを吐き出すことはできるようになったのだけれど、なんか違う。

複数トラック作成しても、1トラック分しか再生されてないように聞こえる。

プログラムチェンジを入れても音色が変わらない。

何が間違っているのか・・

args

昨日のgo runとgo testで挙動が違うのは、os.argsのインデックスが間違っていただけだった・・

os.args[0] はコンパイルしたバイナリで、欲しかったものはos.args[1] でとれた。

なんか初歩的なところで時間溶かした。。

hexdump

SMF出力を確認したくて、hexdump使ったところ、2バイト単位の出力(しかもリトルエンディアン)なのね。

-Cオプション付ければ1バイト単位になるけど、右側にASCII文字も出る。 これのASCIIなし版が見たいんだけど、そういうオプションはないみたい。

$ go run main.go ../../testdata/test.md | hexdump -C
00000000  4d 54 68 64 00 00 00 06  00 01 00 03 03 c0 4d 54  |MThd..........MT|
00000010  72 6b 00 00 00 17 00 ff  03 00 00 ff 51 03 06 8a  |rk..........Q...|
...

-eで書式指定すればいける?と思ったけど、うまくいかない。

Read more

mdmml

昨日マークダウンからMMLを抜き出すところをとりあえず作ったので、 今日はMMLをSMF形式に変換するところを作る。

なかなか思ったように動いてくれない。。

go test と go run で挙動が違うのなんでだ・・

マークダウンでMMLを書く

マークダウンからテーブル部分をmmlとして読み込むところを作っていたら日付が変わってしまって毎日更新に穴があいてしまった。

マークダウンでMMLを書く

main.go と、とりあえず固定値を返すパッケージを書いた。

package main

import (
	"fmt"
	"os"

	"github.com/umemak/mdmml"
)

func main() {
	src, err := os.ReadFile(os.Args[0])
	if err != nil {
		fmt.Printf("%+v\n", err)
		os.Exit(1)
	}
	mm := mdmml.NewMDMML(src)
	os.Stdout.Write(mm.SMF())
}

マークダウンでMMLを書く

とりあえずリポジトリを作成して、VS CodeのDev Containerで開発できるようにした。

timidityはコンテナ内で実行しても出力デバイスが見つからないとかで動かなかった。

SMFの仕様は、Wikipedia見ても具体的にどうなのって感じで、脚注のリンク先も公式以外は消えてしまっていた。 エンディアンとか久しぶりに見た。

Read more

MMLとマークダウンの組み合わせ

どうせ方言が多いなら、ということで自分ならどうするか考えてみた。

で、タイトルのとおりマークダウン記法と組み合わせるといい感じになるんじゃないかなー、と。

具体的には|で区切れるようにする。|はマークダウンだとテーブルになるので、VS Codeとかでプレビューしたときに見やすくなるのではないか。 テーブルの1列目をトラック名にすれば、複数トラックも縦に位置がそろって見やすい。

Read more