diff options
Diffstat (limited to 'apps/plugins/midi/midiutil.c')
-rw-r--r-- | apps/plugins/midi/midiutil.c | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/apps/plugins/midi/midiutil.c b/apps/plugins/midi/midiutil.c new file mode 100644 index 0000000000..0ab5a35a78 --- /dev/null +++ b/apps/plugins/midi/midiutil.c | |||
@@ -0,0 +1,262 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * | ||
9 | * Copyright (C) 2005 Stepan Moskovchenko | ||
10 | * | ||
11 | * All files in this archive are subject to the GNU General Public License. | ||
12 | * See the file COPYING in the source tree root for full license agreement. | ||
13 | * | ||
14 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
15 | * KIND, either express or implied. | ||
16 | * | ||
17 | ****************************************************************************/ | ||
18 | |||
19 | |||
20 | #define BYTE unsigned char | ||
21 | |||
22 | //Data chunk ID types, returned by readID() | ||
23 | #define ID_UNKNOWN -1 | ||
24 | #define ID_MTHD 1 | ||
25 | #define ID_MTRK 2 | ||
26 | #define ID_EOF 3 | ||
27 | |||
28 | //MIDI Commands | ||
29 | #define MIDI_NOTE_OFF 128 | ||
30 | #define MIDI_NOTE_ON 144 | ||
31 | #define MIDI_AFTERTOUCH 160 | ||
32 | #define MIDI_CONTROL 176 | ||
33 | #define MIDI_PRGM 192 | ||
34 | #define MIDI_PITCHW 224 | ||
35 | |||
36 | |||
37 | //MIDI Controllers | ||
38 | #define CTRL_VOLUME 7 | ||
39 | #define CTRL_BALANCE 8 | ||
40 | #define CTRL_PANNING 10 | ||
41 | #define CHANNEL 1 | ||
42 | |||
43 | |||
44 | #define STATE_ATTACK 1 | ||
45 | #define STATE_DECAY 2 | ||
46 | #define STATE_SUSTAIN 3 | ||
47 | #define STATE_RELEASE 4 | ||
48 | #define STATE_RAMPDOWN 5 | ||
49 | |||
50 | #define STATE_LOOPING 7 | ||
51 | #define STATE_NONLOOPING 8 | ||
52 | |||
53 | #define LOOP_ENABLED 4 | ||
54 | #define LOOP_PINGPONG 8 | ||
55 | #define LOOP_REVERSE 16 | ||
56 | |||
57 | #define LOOPDIR_FORWARD 0 | ||
58 | #define LOOPDIR_REVERSE 1 | ||
59 | |||
60 | |||
61 | extern struct plugin_api * rb; | ||
62 | |||
63 | |||
64 | unsigned char chVol[16]; //Channel volume | ||
65 | unsigned char chPanLeft[16]; //Channel panning | ||
66 | unsigned char chPanRight[16]; | ||
67 | unsigned char chPat[16]; //Channel patch | ||
68 | unsigned char chPW[16]; //Channel pitch wheel, MSB | ||
69 | |||
70 | struct GPatch * gusload(char *); | ||
71 | struct GPatch * patchSet[128]; | ||
72 | struct GPatch * drumSet[128]; | ||
73 | struct SynthObject voices[MAX_VOICES]; | ||
74 | |||
75 | |||
76 | |||
77 | struct SynthObject | ||
78 | { | ||
79 | int tmp; | ||
80 | struct GWaveform * wf; | ||
81 | unsigned int delta; | ||
82 | unsigned int decay; | ||
83 | unsigned int cp; | ||
84 | unsigned char state, pstate, loopState, loopDir; | ||
85 | unsigned char note, vol, ch, isUsed; | ||
86 | int curRate, curOffset, targetOffset; | ||
87 | int curPoint; | ||
88 | }; | ||
89 | |||
90 | |||
91 | struct Event | ||
92 | { | ||
93 | unsigned int delta; | ||
94 | unsigned char status, d1, d2; | ||
95 | unsigned int len; | ||
96 | unsigned char * evData; | ||
97 | }; | ||
98 | |||
99 | struct Track | ||
100 | { | ||
101 | unsigned int size; | ||
102 | unsigned int numEvents; | ||
103 | unsigned int delta; //For sequencing | ||
104 | unsigned int pos; //For sequencing | ||
105 | void * dataBlock; | ||
106 | }; | ||
107 | |||
108 | |||
109 | struct MIDIfile | ||
110 | { | ||
111 | int Length; | ||
112 | |||
113 | //int Format; //We don't really care what type it is | ||
114 | unsigned short numTracks; | ||
115 | unsigned short div; //Time division, X ticks per millisecond | ||
116 | struct Track * tracks[48]; | ||
117 | unsigned char patches[128]; | ||
118 | int numPatches; | ||
119 | }; | ||
120 | |||
121 | void *my_malloc(int size); | ||
122 | |||
123 | void *alloc(int size) | ||
124 | { | ||
125 | static char *offset = NULL; | ||
126 | static int totalSize = 0; | ||
127 | char *ret; | ||
128 | |||
129 | if (offset == NULL) | ||
130 | { | ||
131 | offset = rb->plugin_get_audio_buffer(&totalSize); | ||
132 | } | ||
133 | |||
134 | if (size + 4 > totalSize) | ||
135 | { | ||
136 | return NULL; | ||
137 | } | ||
138 | |||
139 | ret = offset + 4; | ||
140 | *((unsigned int *)offset) = size; | ||
141 | |||
142 | offset += size + 4; | ||
143 | totalSize -= size + 4; | ||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | void *ralloc(char *offset, int len) | ||
148 | { | ||
149 | int size; | ||
150 | char *ret; | ||
151 | |||
152 | if (offset == NULL) | ||
153 | { | ||
154 | return alloc(len); | ||
155 | } | ||
156 | |||
157 | size = *((unsigned int *)offset - 4); | ||
158 | |||
159 | if (size >= 0x02000000) | ||
160 | { | ||
161 | return NULL; | ||
162 | } | ||
163 | |||
164 | ret = alloc(len); | ||
165 | |||
166 | if (len < size) | ||
167 | { | ||
168 | rb->memcpy(ret, offset, len); | ||
169 | } | ||
170 | else | ||
171 | { | ||
172 | rb->memcpy(ret, offset, size); | ||
173 | rb->memset(ret, 0, len - size); | ||
174 | } | ||
175 | |||
176 | return ret; | ||
177 | } | ||
178 | |||
179 | |||
180 | void * allocate(int size) | ||
181 | { | ||
182 | return alloc(size); | ||
183 | } | ||
184 | |||
185 | void sendEvent(struct Event * ev); | ||
186 | int tick(struct MIDIfile * mf); | ||
187 | inline void setPoint(struct SynthObject * so, int pt); | ||
188 | struct Event * getEvent(struct Track * tr, int evNum); | ||
189 | |||
190 | unsigned char readChar(int file) | ||
191 | { | ||
192 | char buf[2]; | ||
193 | rb->read(file, &buf, 1); | ||
194 | return buf[0]; | ||
195 | } | ||
196 | |||
197 | unsigned char * readData(int file, int len) | ||
198 | { | ||
199 | unsigned char * dat = allocate(len); | ||
200 | rb->read(file, dat, len); | ||
201 | return dat; | ||
202 | } | ||
203 | |||
204 | int eof(int fd) | ||
205 | { | ||
206 | int curPos = rb->lseek(fd, 0, SEEK_CUR); | ||
207 | |||
208 | int size = rb->lseek(fd, 0, SEEK_END); | ||
209 | |||
210 | rb->lseek(fd, curPos, SEEK_SET); | ||
211 | return size+1 == rb->lseek(fd, 0, SEEK_CUR); | ||
212 | } | ||
213 | |||
214 | void printf(char *fmt, ...) {} | ||
215 | |||
216 | //#define my_malloc(a) malloc(a) | ||
217 | |||
218 | |||
219 | void *audio_bufferbase; | ||
220 | void *audio_bufferpointer; | ||
221 | unsigned int audio_buffer_free; | ||
222 | |||
223 | |||
224 | |||
225 | |||
226 | void *my_malloc(int size) | ||
227 | { | ||
228 | |||
229 | void *alloc; | ||
230 | |||
231 | if (!audio_bufferbase) | ||
232 | { | ||
233 | audio_bufferbase = audio_bufferpointer | ||
234 | = rb->plugin_get_audio_buffer(&audio_buffer_free); | ||
235 | #if MEM <= 8 && !defined(SIMULATOR) | ||
236 | |||
237 | if ((unsigned)(ovl_start_addr - (unsigned char *)audio_bufferbase) | ||
238 | < audio_buffer_free) | ||
239 | audio_buffer_free = ovl_start_addr - (unsigned char *)audio_bufferbase; | ||
240 | #endif | ||
241 | } | ||
242 | if (size + 4 > audio_buffer_free) | ||
243 | return 0; | ||
244 | alloc = audio_bufferpointer; | ||
245 | audio_bufferpointer += size + 4; | ||
246 | audio_buffer_free -= size + 4; | ||
247 | return alloc; | ||
248 | } | ||
249 | |||
250 | void setmallocpos(void *pointer) | ||
251 | { | ||
252 | audio_bufferpointer = pointer; | ||
253 | audio_buffer_free = audio_bufferpointer - audio_bufferbase; | ||
254 | } | ||
255 | |||
256 | void exit(int code) | ||
257 | { | ||
258 | } | ||
259 | |||
260 | void free(void * ptr) | ||
261 | { | ||
262 | } \ No newline at end of file | ||