https://github.com/yamaha-webmusic/ymf825board/blob/master/tonedata/tonedata.txt
ここにあるデータを
sample1.ino(83) void set_tone(void) の中に、データ表現を .ino(C/C++) に変えて放り込めばいいのかな?
エディタのキーボードマクロ機能で、先頭 "0x" を付けてと… あれ? 41 バイト?
https://github.com/yamaha-webmusic/ymf825board/blob/master/manual/fbd_spec1.md
https://github.com/yamaha-webmusic/ymf825board/blob/master/manual/fbd_spec3.md
ここには、30 バイト (Entire Tone Setting[2] + Operator Setting[4][7]) となっている
sample1.ino(83) void set_tone(void) も、1:Header + 30:ToneData + 4:footer で tone_data[35] なので、
「Interface Register に書き込む Tone Parameter は、30 バイト」に間違いない筈
以下:ネイティブフォーマット
小一時間唸っていたら、見つけた!
https://github.com/yamaha-webmusic/ymf825board/blob/master/tonedata/sysexspec.md
このフォーマットなら、41 バイト (Common[1] + (Operator[4][10]) で辻褄が合う
以下:エクスクルーシブフォーマット
「手作業で変換」なんてやってられないので、Windows 上で変換プログラムを作る
ビット対応をまとめる
ビット変換 Ver.2018/01/07
//---------------------------------------------------------------------------
// Tone Parameter
//---------------------------------------------------------------------------
// Native Interface Register Format
typedef union { // spec1 spec3
byte TAD[];
struct {
byte Ent[2];
byte Ope[4][7];
} REG;
}
TNtYMF825T;
// Proposed by Yamaha System Exclusive Format
typedef union { // sysexspec tonedata
byte TAD[];
struct {
byte Com[1];
byte Ope[4][10];
} REG;
}
TExYMF825T;
// C++Builder5 で、
// 30 = sizeof(TNtYMF825T)
// 41 = sizeof(TExYMF825T)
// 他のコンパイラでは「詰め物」に注意
// sysexspec spec1,3
// BO:2 [0]:_BBxxxxx -> [0]:xxxxxxBB
// LFO:2 [0]:_xxLLxxx -> [1]:LLxxxxxx
// ARG:3 [0]:_xxxxAAA -> [1]:xxxxxAAA
// OperatorTop#: 8 submit sysexspec
// OperatorTop#: 2 submit spec1,3
// sysexspec spec1,3
// FB:3 [Top+ 0]:_FFFxxxx -> [Top+ 6]:xxxxxFFF
// XOF:1 [Top+ 0]:_xxxXxxx -> [Top+ 0]:xxxxXxxx
// KSR:1 [Top+ 0]:_xxxxKxx -> [Top+ 0]:xxxxxxxK
// KSL:2 [Top+ 0]:_xxxxxKK -> [Top+ 3]:xxxxxxKK
// AR:4 [Top+ 1]:_xxxAAAA -> [Top+ 2]:AAAAxxxx
// DR:4 [Top+ 2]:_xxxDDDD -> [Top+ 1]:xxxxDDDD
// SR:4 [Top+ 3]:_xxxSSSS -> [Top+ 0]:SSSSxxxx
// RR:4 [Top+ 4]:_xxxRRRR -> [Top+ 1]:RRRRxxxx
// SL:4 [Top+ 5]:_xxxSSSS -> [Top+ 2]:xxxxSSSS
// TL:6 [Top+ 6]:_xTTTTTT -> [Top+ 3]:TTTTTTxx
// DAM:2 [Top+ 7]:_DDxxxxx -> [Top+ 4]:xDDxxxxx
// EAM:1 [Top+ 7]:_xxExxxx -> [Top+ 4]:xxxExxxx
// DVB:2 [Top+ 7]:_xxxxDDx -> [Top+ 4]:xxxxxDDx
// EVB:1 [Top+ 7]:_xxxxxxE -> [Top+ 4]:xxxxxxxE
// DT:3 [Top+ 8]:_DDDxxxx -> [Top+ 5]:xxxxxDDD
// MT:4 [Top+ 8]:_xxxMMMM -> [Top+ 5]:MMMMxxxx
// WS:5 [Top+ 9]:_xxWWWWW -> [Top+ 6]:WWWWWxxx
// sysexspec:'FB:5 0-15'
全てのビット対応があることを確認 でもまだ、間違いがあるかもしれない
作った対応表を元にビット変換を記述していく こんな感じ
ps は エクスクルーシブフォーマットのオペレータデータ先頭
pd は ネイティブフォーマットのオペレータデータ先頭 先に全クリア
// FB:3 [Top+ 0]:_FFFxxxx -> [Top+ 6]:xxxxxFFF
get = *(ps + 0); get >>= 4; get &= 0x07;
*(pd + 6) |= (byte)get;
このサイトページを編集していたらバグを見つけた(汗
上 ToneData テキストを貼付け
左 エクスクルーシブフォーマット
右 ネイティブフォーマット
右のネイティブを sample1.ino(83) set_tone() のデータ部分に貼り付ける
前後のブレス '{' '}' は要らないので取る
tonedata.txt GrandPiano by YAMAHA はまだちゃんと鳴っていない (2018/01/06)