木星劲乐团

 找回密码
 立即注册
搜索
查看: 6411|回复: 3
打印 上一主题 下一主题

[分享] ojn字节集

[复制链接]

管理员

有问题加我qq/微信:1844502392

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
64
主题
629
帖子
1648
金钱
6028
积分
10947
在线时间
5016 小时
注册时间
2013-8-18
跳转到指定楼层
楼主
发表于 2015-6-11 17:20 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
.版本 2

        ' note总数
        歌曲音符16 = 删首空 (字节集到十六进制文本 (取字节集中间 (文件字节集, 49, 2)))
        数据处理1 = 分割文本 (歌曲音符16, “ ”, 2)


        音符最终 = 十六进制到十进制 (数据处理1 [2] + 数据处理1 [1])

这些数字位置即ue打开后的每行16个第一行1~16
第二行17~32
以此类推
struct header {

int songid; 00-03

char signature[4];03-07

float encode_version;08-11

int genre;12-15

float bpm;16-19

short level[4];20-27

int event_count[3];28-39

int note_count[3];40-51

int measure_count[3];52-63

int package_count[3];64-75

short old_encode_version;76-77

short old_songid;78-79

char old_genre[20];80-99

int bmp_size;100-103

int old_file_version;104-107

char title[64];108-171

char artist[32];172-203

char noter[32];204-235

char ojm_file[32];236-267

int cover_size;268-271

int time[3];272-283

int note_offset[3];284-295

int cover_offset;296-299

};


共300字节



int songid;   歌曲内部编号


char signature[4]; 幻数。用来标记当前文件是否是ojn文件 通常为"ojn"  即ojn\0


float encode_version;  OJN版本 通常为2.9 没什么卵用


int genre;  歌曲类型  没什么卵用
以下为具体枚举值
Ballad
1        Rock
2        Dance
3        Techno
4        Hip-hop
5        Soul/R&B
6        Jazz
7        Funk
8        Classical
9        Traditional
10        Etc


float bpm;   初始BPM

short level[4];歌曲的3个等级  只使用前3个 范围0~65535

int event_count[3]; 表示3个难度,包括bpm列 note列 BGM列 总共23列(待确认) 在内的所有音符的总数

int note_count[3];  不包括bpm和bgm音乐列在内的note总数(选歌界面上显示的note数)即实际弹奏区的note

int measure_count[3]; 3个难度各自有多少小节数  

int package_count[3]; 标记包的数量 3难度,package代表一个小节中的某一列

short old_encode_version;

short old_songid;

char old_genre[20];  这三个貌似是以前版本的ojn格式用来存放编码版本 歌曲编号 以及歌曲 风格 3个参数值的变量 并没有什么卵用

int bmp_size; 选歌面板上歌曲的小缩略图的文件大小 bmp格式的

int old_file_version; 文件版本 没卵用

char title[64];  歌名

char artist[32]; 作曲家名

char noter[32]; noter名

char ojm_file[32]; 相关联的ojm文件名,一般o2maxxxx.ojm

int cover_size; 歌曲封面文件大小  jpg格式  就是载入歌曲时的那个图

int time[3];   3 难度歌曲时长 单位是秒

int note_offset[3]; 3难度各note数据部分基址相对ojn文件开头的偏移,  见下面解释

int cover_offset; 同上 封面偏移 见下面解释


整个ojn文件结构:
{
        header  300 byte
        data  easy
        data  normal
        data  hard
        jpg  载入界面图片
        bmp  bmp小预览图
}

sizeof(header) :0-300字节是描述歌曲信息的部分

note_offset[0]: 这个值通常就是300 表示easy难度的数据区首地址

note_offset[1]: normal数据区首地址

note_offset[2]:hard难度首地址

cover_offset: jpg首地址

cover_offset+cover_size: bmp首地址
ojn whole file size: bmp尾地址

因此
easy数据区大小可以用note_offset[1] - note_offset[0]  计算
其余同理

下面针对note数据区做说明

每个难度的数据区由
包(package) +包 + 包 + 包...... 组成  (上面提到过
其中每个包又由描述头部分(package_header) 加数据区(note_event数组) 2个部分组成
因此又可以描述为
包(package_header+note_event[])+包(package_header+note_event[])+包(package_header+note_event[])...



struct package_header {
int32   measure;          //标明这个package是属于第几小节线

short16 channel;         //标明这个package是第几列的  具体取值见下面      

short16 events;          // 标明这个package 使用的是多少格线.  最大是192线(我已经测过).比如是64线那么package_header后面就会紧跟上一个note_event[64]数组;
};

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类型




每个note_event有4个字节,
当channel==0 类型为float 表示当前小节按多少百分比显示
当channel==1 类型为float 表示bpm值

当channel 为2-22  表示实际的note此时结构如下(9-22为bgm列 自动弹奏note)

struct note_event {
        short16 value;
        half-char volume;
        half-char pan;
        char note_type;
};
value 表示Key音列表的索引值 比如这个值为17 那么key表索引值=17的地方如果有放一个
"abc.ogg"的音频key 那么击打时就会自动播放

volume; 播放key的音量,1-15,0为最大  基本用不到 置0即可
pan;  左右声道权重,1-7 左,0或8表示中间,9-15右 用不到 置0
note_type ; 为0时表示米粒,2表示LN的开头,3表示LN的结尾,4 不确定 可能表示  当wav和ogg同时存在时 辨别是不是ogg用的







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;
};


























qq微信:1844502392
官方答疑qq群:648502217
微信聊天群:1844502392
技术交流微信群:1844502392(注明不是进大群)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /6 下一条


QQ|Archiver|手机版|木星劲乐团

GMT+8, 2024-5-6 12:40 , Processed in 0.053696 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表