Posts
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
で書式指定すればいける?と思ったけど、うまくいかない。
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 moreMMLとマークダウンの組み合わせ
どうせ方言が多いなら、ということで自分ならどうするか考えてみた。
で、タイトルのとおりマークダウン記法と組み合わせるといい感じになるんじゃないかなー、と。
具体的には|
で区切れるようにする。|
はマークダウンだとテーブルになるので、VS Codeとかでプレビューしたときに見やすくなるのではないか。
テーブルの1列目をトラック名にすれば、複数トラックも縦に位置がそろって見やすい。