-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpart.c
120 lines (100 loc) · 2.9 KB
/
part.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* -*- mode: c; encoding: utf-8-unix; -*- */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "demucc.h"
/**
* @return パート終了のとき 1, そうでないとき 0
*/
int read_notes(struct pmd* pmd, uint8_t** pp)
{
int n;
while(1) {
if(pmd->return_addr != 0
&& (*pp - pmd->buffer) == pmd->return_addr) {
mml_printf(pmd, " L ");
pmd->return_addr = 0;
}
n = read_u8(pp);
if(n >= 0xe0) {
if(read_commands(pmd, n, pp) != 0) {
return 1;
}
} else if(n >= 0x80) {
if(pmd->track_attr & TRATTR_DRUMS) {
int index = n - 0x80;
char drumname[DRUMNAME_MAX];
char beats[16];
get_drumname(index, drumname, sizeof drumname);
tick2beat(pmd, pmd->len, beats);
mml_printf(pmd, "!%sg%s", drumname, beats);
pmd->tick = (pmd->tick + pmd->len) % TIMEBASE;
if(pmd->tick == 0) {
mml_printf(pmd, " ");
}
} else {
int note = n - 0x80 + 12;
get_note(pmd, note, pmd->len, 0);
}
} else if(n != 0) {
if(n == 127) {
n = read_u8(pp);
if(n < 127) n += 256;
}
if(pmd->porsw != 0) {
pmd->porlen = pmd->len = n;
} else {
if(pmd->len != n) {
pmd->len = n;
// mucc は l で付点を書くとバグるので、ここでは何もしない
}
}
} else {
// n == 0
int lsp = pmd->sp;
if(lsp == 0) {
return 1;
}
lsp -= 3;
if(--pmd->stack[lsp] != 0) {
// repeat
*pp = pmd->buffer + pmd->stack[lsp + 2];
} else {
// return
*pp = pmd->buffer + pmd->stack[lsp + 1];
pmd->sp = lsp;
mml_newline(pmd);
}
}
}
return 0;
}
int extract_drums(struct pmd* pmd)
{
uint16_t* pd = (uint16_t*)pmd->drums;
uint8_t* p;
int i = 0;
char drumname[DRUMNAME_MAX];
if(pmd->drums == pmd->buffer) {
return 0;
}
while(1) {
if((uint8_t*)pd >= pmd->buffer + pmd->buffer_size)
break;
get_drumname(i, drumname, sizeof drumname);
reset_part_ctx(pmd);
pmd->track_attr = TRATTR_DRUMS;
pmd->sp = 0;
pmd->len = 0;
pmd->part = -1;
mmlbuf_reset(pmd->mmlbuf);
mml_printf(pmd, "!!%sg ", drumname);
p = pmd->buffer + *pd;
read_notes(pmd, &p);
printf("%s\n", mmlbuf_buf(pmd->mmlbuf));
pd++;
i++;
}
printf("\n");
return 0;
}