summaryrefslogtreecommitdiff
path: root/apps/plugins/midi/midiutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/midi/midiutil.c')
-rw-r--r--apps/plugins/midi/midiutil.c262
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
61extern struct plugin_api * rb;
62
63
64unsigned char chVol[16]; //Channel volume
65unsigned char chPanLeft[16]; //Channel panning
66unsigned char chPanRight[16];
67unsigned char chPat[16]; //Channel patch
68unsigned char chPW[16]; //Channel pitch wheel, MSB
69
70struct GPatch * gusload(char *);
71struct GPatch * patchSet[128];
72struct GPatch * drumSet[128];
73struct SynthObject voices[MAX_VOICES];
74
75
76
77struct 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
91struct Event
92{
93 unsigned int delta;
94 unsigned char status, d1, d2;
95 unsigned int len;
96 unsigned char * evData;
97};
98
99struct 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
109struct 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
121void *my_malloc(int size);
122
123void *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
147void *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
180void * allocate(int size)
181{
182 return alloc(size);
183}
184
185void sendEvent(struct Event * ev);
186int tick(struct MIDIfile * mf);
187inline void setPoint(struct SynthObject * so, int pt);
188struct Event * getEvent(struct Track * tr, int evNum);
189
190unsigned char readChar(int file)
191{
192 char buf[2];
193 rb->read(file, &buf, 1);
194 return buf[0];
195}
196
197unsigned char * readData(int file, int len)
198{
199 unsigned char * dat = allocate(len);
200 rb->read(file, dat, len);
201 return dat;
202}
203
204int 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
214void printf(char *fmt, ...) {}
215
216//#define my_malloc(a) malloc(a)
217
218
219void *audio_bufferbase;
220void *audio_bufferpointer;
221unsigned int audio_buffer_free;
222
223
224
225
226void *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
250void setmallocpos(void *pointer)
251{
252 audio_bufferpointer = pointer;
253 audio_buffer_free = audio_bufferpointer - audio_bufferbase;
254}
255
256void exit(int code)
257{
258}
259
260void free(void * ptr)
261{
262} \ No newline at end of file