channel的取值:
0 measure fraction //nt里有一列可以调 一个小节要显示百分之多少就是这列 和ibmsc里的小节线比例等同
1 BPM change //bpm 值
2 note on 1st lane
3 note on 2nd lane
4 note on 3rd lane
5 note on 4th lane(middle button)
6 note on 5th lane
7 note on 6th lane
8 note on 7th lane
9~22 auto-play samples //bgm列
注意的是 当channel为 0或1的时候 note_event是个float类型(4字节)
当channel为2-22时note_event类型(也是4字节) 也就是package_header后面跟的数组实际解释类型取决于channel列的取值 可以把note_event和float看成一个union类型
OJM 部分//待完成
struct M30_header {
char signature[4]; // "M30"
int file_format_version;
int encryption_flag;
int sample_count;
int samples_offset;
int payload_size;
int padding;
};
ojm 首先是一个 header,28字节: struct M30_header {
char signature[4]; // 固定字符串 "M30"
int file_format_version; // internal version of the OJM format.
int encryption_flag; // encrypted format: 1 scramble1; 2 scramble2; 4 decode; 8 decrypt; 16 nami
int sample_count; // the number of sound files inside the OJM(we don’t rely on this much)
int samples_offset; // where the data actually starts, usually after the header(28)
int payload_size; // the size of the rest of the file, usually total_file_size – 28(header), in bytes
int padding;
};
这部分结束后,每个 sample 还有一个 header 元信息,52字节: struct M30_sample_header {
char sample_name[32]; //
int sample_size;
short codec_code;
short unk_fixed;
int unk_music_flag;
short ref;
short unk_zero;
int pcm_samples;
};
下面简单说明: struct OMC_header {
char signature[4]; // "OMC" or "OJM"
short wav_count;
short ogg_count;
int wav_start;
int ogg_start;
int filesize;
};
此元信息共 20 字节,结构非常清晰。
wav 就是 nt 中的 W###;
ogg 就是 nt 中的 M###。
count 就是实际的数量,filesize 就是整个文件的大小。
之后的数据就是 wav 数据和 ogg 数据。和 M30 相同,之前都有一个结构体保存元信息: struct OMC_WAV_header {
char sample_name[32];
short audio_format;
short num_channels;
int sample_rate;
int bit_rate;
short block_align;
short bits_per_sample;
int unk_data;
int chunk_size;
};