2005-04-15 06:08:55 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
*
|
|
|
|
* Copyright (C) 2005 Stepan Moskovchenko
|
|
|
|
*
|
|
|
|
* All files in this archive are subject to the GNU General Public License.
|
|
|
|
* See the file COPYING in the source tree root for full license agreement.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#define BYTE unsigned char
|
|
|
|
|
|
|
|
//Data chunk ID types, returned by readID()
|
2005-04-20 21:07:13 +00:00
|
|
|
#define ID_UNKNOWN -1
|
|
|
|
#define ID_MTHD 1
|
|
|
|
#define ID_MTRK 2
|
|
|
|
#define ID_EOF 3
|
2005-04-15 06:08:55 +00:00
|
|
|
|
|
|
|
//MIDI Commands
|
2005-04-20 21:07:13 +00:00
|
|
|
#define MIDI_NOTE_OFF 128
|
|
|
|
#define MIDI_NOTE_ON 144
|
|
|
|
#define MIDI_AFTERTOUCH 160
|
|
|
|
#define MIDI_CONTROL 176
|
|
|
|
#define MIDI_PRGM 192
|
|
|
|
#define MIDI_PITCHW 224
|
2005-04-15 06:08:55 +00:00
|
|
|
|
|
|
|
|
|
|
|
//MIDI Controllers
|
2005-04-20 21:07:13 +00:00
|
|
|
#define CTRL_VOLUME 7
|
|
|
|
#define CTRL_BALANCE 8
|
|
|
|
#define CTRL_PANNING 10
|
|
|
|
#define CHANNEL 1
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-15 20:27:04 +00:00
|
|
|
//Most of these are deprecated.. rampdown is used, maybe one other one too
|
2005-04-20 21:07:13 +00:00
|
|
|
#define STATE_ATTACK 1
|
|
|
|
#define STATE_DECAY 2
|
|
|
|
#define STATE_SUSTAIN 3
|
|
|
|
#define STATE_RELEASE 4
|
|
|
|
#define STATE_RAMPDOWN 5
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-15 20:27:04 +00:00
|
|
|
//Loop states
|
2005-04-15 06:08:55 +00:00
|
|
|
#define STATE_LOOPING 7
|
2005-04-20 21:07:13 +00:00
|
|
|
#define STATE_NONLOOPING 8
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-15 20:27:04 +00:00
|
|
|
//Various bits in the GUS mode byte
|
2005-04-20 21:07:13 +00:00
|
|
|
#define LOOP_ENABLED 4
|
2005-04-15 06:08:55 +00:00
|
|
|
#define LOOP_PINGPONG 8
|
|
|
|
#define LOOP_REVERSE 16
|
|
|
|
|
|
|
|
#define LOOPDIR_FORWARD 0
|
|
|
|
#define LOOPDIR_REVERSE 1
|
|
|
|
|
|
|
|
|
|
|
|
extern struct plugin_api * rb;
|
|
|
|
|
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
int chVol[16] IDATA_ATTR; /* Channel volume */
|
|
|
|
int chPanLeft[16] IDATA_ATTR; /* Channel panning */
|
2005-04-19 15:57:07 +00:00
|
|
|
int chPanRight[16] IDATA_ATTR;
|
2005-04-20 21:07:13 +00:00
|
|
|
int chPat[16]; /* Channel patch */
|
|
|
|
int chPW[16]; /* Channel pitch wheel, MSB only */
|
2005-04-19 15:57:07 +00:00
|
|
|
|
|
|
|
|
2005-04-15 06:08:55 +00:00
|
|
|
struct GPatch * gusload(char *);
|
|
|
|
struct GPatch * patchSet[128];
|
|
|
|
struct GPatch * drumSet[128];
|
|
|
|
|
|
|
|
struct Event
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
unsigned int delta;
|
|
|
|
unsigned char status, d1, d2;
|
|
|
|
unsigned int len;
|
|
|
|
unsigned char * evData;
|
2005-04-15 06:08:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Track
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
unsigned int size;
|
|
|
|
unsigned int numEvents;
|
|
|
|
unsigned int delta; /* For sequencing */
|
|
|
|
unsigned int pos; /* For sequencing */
|
|
|
|
void * dataBlock;
|
2005-04-15 06:08:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct MIDIfile
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
int Length;
|
|
|
|
unsigned short numTracks;
|
|
|
|
unsigned short div; /* Time division, X ticks per millisecond */
|
|
|
|
struct Track * tracks[48];
|
|
|
|
unsigned char patches[128];
|
|
|
|
int numPatches;
|
2005-04-15 06:08:55 +00:00
|
|
|
};
|
2005-04-20 21:07:13 +00:00
|
|
|
|
2005-04-19 15:57:07 +00:00
|
|
|
/*
|
|
|
|
struct SynthObject
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
struct GWaveform * wf;
|
|
|
|
unsigned int delta;
|
|
|
|
unsigned int decay;
|
|
|
|
unsigned int cp;
|
|
|
|
unsigned char state, loopState, loopDir;
|
|
|
|
unsigned char note, vol, ch, isUsed;
|
|
|
|
int curRate, curOffset, targetOffset;
|
|
|
|
unsigned int curPoint;
|
2005-04-19 15:57:07 +00:00
|
|
|
};
|
|
|
|
*/
|
2005-04-20 21:07:13 +00:00
|
|
|
|
2005-04-19 15:57:07 +00:00
|
|
|
struct SynthObject
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
struct GWaveform * wf;
|
|
|
|
int delta;
|
|
|
|
int decay;
|
|
|
|
unsigned int cp;
|
|
|
|
int state, loopState, loopDir;
|
|
|
|
int note, vol, ch, isUsed;
|
|
|
|
int curRate, curOffset, targetOffset;
|
|
|
|
int curPoint;
|
2005-04-19 15:57:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct SynthObject voices[MAX_VOICES] IDATA_ATTR;
|
2005-04-15 06:08:55 +00:00
|
|
|
|
|
|
|
|
2005-04-15 20:27:04 +00:00
|
|
|
|
|
|
|
void sendEvent(struct Event * ev);
|
|
|
|
int tick(struct MIDIfile * mf);
|
|
|
|
inline void setPoint(struct SynthObject * so, int pt);
|
|
|
|
struct Event * getEvent(struct Track * tr, int evNum);
|
|
|
|
int readTwoBytes(int file);
|
|
|
|
int readFourBytes(int file);
|
|
|
|
int readVarData(int file);
|
|
|
|
int midimain(void * filename);
|
|
|
|
|
|
|
|
|
2005-04-15 06:08:55 +00:00
|
|
|
void *alloc(int size)
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
static char *offset = NULL;
|
|
|
|
static int totalSize = 0;
|
|
|
|
char *ret;
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
int remainder = size % 4;
|
2005-04-19 15:57:07 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
size = size + 4-remainder;
|
2005-04-19 15:57:07 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
if (offset == NULL)
|
|
|
|
{
|
|
|
|
offset = rb->plugin_get_audio_buffer(&totalSize);
|
|
|
|
}
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
if (size + 4 > totalSize)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
ret = offset + 4;
|
|
|
|
*((unsigned int *)offset) = size;
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
offset += size + 4;
|
|
|
|
totalSize -= size + 4;
|
|
|
|
return ret;
|
2005-04-15 06:08:55 +00:00
|
|
|
}
|
2005-04-19 15:57:07 +00:00
|
|
|
|
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
/* Rick's code */
|
2005-04-15 20:27:04 +00:00
|
|
|
/*
|
2005-04-19 15:57:07 +00:00
|
|
|
void *alloc(int size)
|
2005-04-15 06:08:55 +00:00
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
static char *offset = NULL;
|
|
|
|
static int totalSize = 0;
|
|
|
|
char *ret;
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-19 15:57:07 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
if (offset == NULL)
|
|
|
|
{
|
|
|
|
offset = rb->plugin_get_audio_buffer(&totalSize);
|
|
|
|
}
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
if (size + 4 > totalSize)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
ret = offset + 4;
|
|
|
|
*((unsigned int *)offset) = size;
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
offset += size + 4;
|
|
|
|
totalSize -= size + 4;
|
|
|
|
return ret;
|
2005-04-19 15:57:07 +00:00
|
|
|
}*/
|
2005-04-15 06:08:55 +00:00
|
|
|
void * allocate(int size)
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
return alloc(size);
|
2005-04-15 06:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
unsigned char readChar(int file)
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
char buf[2];
|
|
|
|
rb->read(file, &buf, 1);
|
|
|
|
return buf[0];
|
2005-04-15 06:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
unsigned char * readData(int file, int len)
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
unsigned char * dat = allocate(len);
|
|
|
|
rb->read(file, dat, len);
|
|
|
|
return dat;
|
2005-04-15 06:08:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int eof(int fd)
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
int curPos = rb->lseek(fd, 0, SEEK_CUR);
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
int size = rb->lseek(fd, 0, SEEK_END);
|
2005-04-15 06:08:55 +00:00
|
|
|
|
2005-04-20 21:07:13 +00:00
|
|
|
rb->lseek(fd, curPos, SEEK_SET);
|
|
|
|
return size+1 == rb->lseek(fd, 0, SEEK_CUR);
|
2005-04-15 06:08:55 +00:00
|
|
|
}
|
|
|
|
|
2005-04-15 20:27:04 +00:00
|
|
|
void printf(char *fmt, ...) {fmt=fmt; }
|
2005-04-15 06:08:55 +00:00
|
|
|
|
|
|
|
void exit(int code)
|
|
|
|
{
|
2005-04-20 21:07:13 +00:00
|
|
|
code = code; /* Stub function, kill warning for now */
|
2005-04-15 06:08:55 +00:00
|
|
|
}
|