blob: d0b968e52cbb45665aecde1efd028ab8c3851bc0 [file] [log] [blame]
Stepan Moskovchenko215e4922005-04-15 06:08:55 +00001/***************************************************************************
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()
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000023#define ID_UNKNOWN -1
24#define ID_MTHD 1
25#define ID_MTRK 2
26#define ID_EOF 3
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000027
28//MIDI Commands
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000029#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
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000035
36
37//MIDI Controllers
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000038#define CTRL_VOLUME 7
39#define CTRL_BALANCE 8
40#define CTRL_PANNING 10
41#define CHANNEL 1
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000042
Stepan Moskovchenko58112142005-04-15 20:27:04 +000043//Most of these are deprecated.. rampdown is used, maybe one other one too
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000044#define STATE_ATTACK 1
45#define STATE_DECAY 2
46#define STATE_SUSTAIN 3
47#define STATE_RELEASE 4
48#define STATE_RAMPDOWN 5
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000049
Stepan Moskovchenko58112142005-04-15 20:27:04 +000050//Loop states
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000051#define STATE_LOOPING 7
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000052#define STATE_NONLOOPING 8
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000053
Stepan Moskovchenko58112142005-04-15 20:27:04 +000054//Various bits in the GUS mode byte
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000055#define LOOP_ENABLED 4
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000056#define LOOP_PINGPONG 8
57#define LOOP_REVERSE 16
58
59#define LOOPDIR_FORWARD 0
60#define LOOPDIR_REVERSE 1
61
62
63extern struct plugin_api * rb;
64
65
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000066int chVol[16] IDATA_ATTR; /* Channel volume */
67int chPanLeft[16] IDATA_ATTR; /* Channel panning */
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000068int chPanRight[16] IDATA_ATTR;
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000069int chPat[16]; /* Channel patch */
70int chPW[16]; /* Channel pitch wheel, MSB only */
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +000071
72
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000073struct GPatch * gusload(char *);
74struct GPatch * patchSet[128];
75struct GPatch * drumSet[128];
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000076
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000077struct Event
78{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000079 unsigned int delta;
80 unsigned char status, d1, d2;
81 unsigned int len;
82 unsigned char * evData;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000083};
84
85struct Track
86{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000087 unsigned int size;
88 unsigned int numEvents;
89 unsigned int delta; /* For sequencing */
90 unsigned int pos; /* For sequencing */
91 void * dataBlock;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +000092};
93
94
95struct MIDIfile
96{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +000097 int Length;
98 unsigned short numTracks;
99 unsigned short div; /* Time division, X ticks per millisecond */
100 struct Track * tracks[48];
101 unsigned char patches[128];
102 int numPatches;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000103};
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000104
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000105/*
106struct SynthObject
107{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000108 struct GWaveform * wf;
109 unsigned int delta;
110 unsigned int decay;
111 unsigned int cp;
112 unsigned char state, loopState, loopDir;
113 unsigned char note, vol, ch, isUsed;
114 int curRate, curOffset, targetOffset;
115 unsigned int curPoint;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000116};
117*/
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000118
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000119struct SynthObject
120{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000121 struct GWaveform * wf;
122 int delta;
123 int decay;
124 unsigned int cp;
125 int state, loopState, loopDir;
126 int note, vol, ch, isUsed;
127 int curRate, curOffset, targetOffset;
128 int curPoint;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000129};
130
131struct SynthObject voices[MAX_VOICES] IDATA_ATTR;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000132
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000133
Stepan Moskovchenko58112142005-04-15 20:27:04 +0000134
135void sendEvent(struct Event * ev);
136int tick(struct MIDIfile * mf);
137inline void setPoint(struct SynthObject * so, int pt);
138struct Event * getEvent(struct Track * tr, int evNum);
139int readTwoBytes(int file);
140int readFourBytes(int file);
141int readVarData(int file);
142int midimain(void * filename);
143
144
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000145void *alloc(int size)
146{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000147 static char *offset = NULL;
148 static int totalSize = 0;
149 char *ret;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000150
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000151 int remainder = size % 4;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000152
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000153 size = size + 4-remainder;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000154
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000155 if (offset == NULL)
156 {
157 offset = rb->plugin_get_audio_buffer(&totalSize);
158 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000159
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000160 if (size + 4 > totalSize)
161 {
162 return NULL;
163 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000164
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000165 ret = offset + 4;
166 *((unsigned int *)offset) = size;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000167
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000168 offset += size + 4;
169 totalSize -= size + 4;
170 return ret;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000171}
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000172
173
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000174/* Rick's code */
Stepan Moskovchenko58112142005-04-15 20:27:04 +0000175/*
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000176void *alloc(int size)
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000177{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000178 static char *offset = NULL;
179 static int totalSize = 0;
180 char *ret;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000181
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000182
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000183 if (offset == NULL)
184 {
185 offset = rb->plugin_get_audio_buffer(&totalSize);
186 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000187
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000188 if (size + 4 > totalSize)
189 {
190 return NULL;
191 }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000192
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000193 ret = offset + 4;
194 *((unsigned int *)offset) = size;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000195
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000196 offset += size + 4;
197 totalSize -= size + 4;
198 return ret;
Stepan Moskovchenko1f5fb992005-04-19 15:57:07 +0000199}*/
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000200void * allocate(int size)
201{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000202 return alloc(size);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000203}
204
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000205unsigned char readChar(int file)
206{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000207 char buf[2];
208 rb->read(file, &buf, 1);
209 return buf[0];
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000210}
211
212unsigned char * readData(int file, int len)
213{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000214 unsigned char * dat = allocate(len);
215 rb->read(file, dat, len);
216 return dat;
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000217}
218
219int eof(int fd)
220{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000221 int curPos = rb->lseek(fd, 0, SEEK_CUR);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000222
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000223 int size = rb->lseek(fd, 0, SEEK_END);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000224
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000225 rb->lseek(fd, curPos, SEEK_SET);
226 return size+1 == rb->lseek(fd, 0, SEEK_CUR);
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000227}
228
Stepan Moskovchenko58112142005-04-15 20:27:04 +0000229void printf(char *fmt, ...) {fmt=fmt; }
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000230
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000231void exit(int code)
232{
Stepan Moskovchenko9ec1ff82005-04-20 21:07:13 +0000233 code = code; /* Stub function, kill warning for now */
Stepan Moskovchenko215e4922005-04-15 06:08:55 +0000234}