Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
Nils Wallménius | 0e49605 | 2007-09-24 15:57:32 +0000 | [diff] [blame] | 8 | * $Id$ |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 9 | * |
| 10 | * Copyright (C) 2005 Stepan Moskovchenko |
| 11 | * |
| 12 | * All files in this archive are subject to the GNU General Public License. |
| 13 | * See the file COPYING in the source tree root for full license agreement. |
| 14 | * |
| 15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 16 | * KIND, either express or implied. |
| 17 | * |
| 18 | ****************************************************************************/ |
Nils Wallménius | 0e49605 | 2007-09-24 15:57:32 +0000 | [diff] [blame] | 19 | #include "plugin.h" |
| 20 | #include "midiutil.h" |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 21 | |
| 22 | extern struct plugin_api * rb; |
| 23 | |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 24 | int chVol[16] IBSS_ATTR; /* Channel volume */ |
Nils Wallménius | e1940b8 | 2007-10-04 19:36:42 +0000 | [diff] [blame] | 25 | int chPan[16] IBSS_ATTR; /* Channel panning */ |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 26 | int chPat[16] IBSS_ATTR; /* Channel patch */ |
| 27 | int chPW[16] IBSS_ATTR; /* Channel pitch wheel, MSB only */ |
Stepan Moskovchenko | d33645b | 2007-10-17 03:48:24 +0000 | [diff] [blame^] | 28 | int chPBDepth[16] IBSS_ATTR; /* Channel pitch bend depth */ |
| 29 | int chPBNoteOffset[16] IBSS_ATTR; /* Pre-computed whole semitone offset */ |
| 30 | int chPBFractBend[16] IBSS_ATTR; /* Fractional bend applied to delta */ |
| 31 | |
Stepan Moskovchenko | 1f5fb99 | 2005-04-19 15:57:07 +0000 | [diff] [blame] | 32 | |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 33 | struct GPatch * gusload(char *); |
| 34 | struct GPatch * patchSet[128]; |
| 35 | struct GPatch * drumSet[128]; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 36 | |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 37 | struct SynthObject voices[MAX_VOICES] IBSS_ATTR; |
Stepan Moskovchenko | 5811214 | 2005-04-15 20:27:04 +0000 | [diff] [blame] | 38 | |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 39 | void *alloc(int size) |
| 40 | { |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 41 | static char *offset = NULL; |
Michael Sevakis | 26d242a | 2007-04-21 18:38:25 +0000 | [diff] [blame] | 42 | static ssize_t totalSize = 0; |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 43 | char *ret; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 44 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 45 | int remainder = size % 4; |
Stepan Moskovchenko | 1f5fb99 | 2005-04-19 15:57:07 +0000 | [diff] [blame] | 46 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 47 | size = size + 4-remainder; |
Stepan Moskovchenko | 1f5fb99 | 2005-04-19 15:57:07 +0000 | [diff] [blame] | 48 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 49 | if (offset == NULL) |
| 50 | { |
Michael Sevakis | 8676dc2 | 2007-04-21 19:07:15 +0000 | [diff] [blame] | 51 | offset = rb->plugin_get_audio_buffer((size_t *)&totalSize); |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 52 | } |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 53 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 54 | if (size + 4 > totalSize) |
| 55 | { |
Jens Arnold | b1f0049 | 2007-04-21 05:35:17 +0000 | [diff] [blame] | 56 | printf("MALLOC BARF"); |
| 57 | printf("MALLOC BARF"); |
| 58 | printf("MALLOC BARF"); |
| 59 | printf("MALLOC BARF"); |
| 60 | printf("MALLOC BARF"); |
| 61 | printf("MALLOC BARF"); |
| 62 | printf("MALLOC BARF"); |
Stepan Moskovchenko | 47efba8 | 2006-05-03 05:18:18 +0000 | [diff] [blame] | 63 | /* We've made our point. */ |
| 64 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 65 | return NULL; |
| 66 | } |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 67 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 68 | ret = offset + 4; |
| 69 | *((unsigned int *)offset) = size; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 70 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 71 | offset += size + 4; |
| 72 | totalSize -= size + 4; |
| 73 | return ret; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 74 | } |
Stepan Moskovchenko | 1f5fb99 | 2005-04-19 15:57:07 +0000 | [diff] [blame] | 75 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 76 | /* Rick's code */ |
Stepan Moskovchenko | 5811214 | 2005-04-15 20:27:04 +0000 | [diff] [blame] | 77 | /* |
Stepan Moskovchenko | 1f5fb99 | 2005-04-19 15:57:07 +0000 | [diff] [blame] | 78 | void *alloc(int size) |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 79 | { |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 80 | static char *offset = NULL; |
Michael Sevakis | 26d242a | 2007-04-21 18:38:25 +0000 | [diff] [blame] | 81 | static ssize_t totalSize = 0; |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 82 | char *ret; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 83 | |
Stepan Moskovchenko | 1f5fb99 | 2005-04-19 15:57:07 +0000 | [diff] [blame] | 84 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 85 | if (offset == NULL) |
| 86 | { |
Michael Sevakis | 8676dc2 | 2007-04-21 19:07:15 +0000 | [diff] [blame] | 87 | offset = rb->plugin_get_audio_buffer((size_t *)&totalSize); |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 88 | } |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 89 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 90 | if (size + 4 > totalSize) |
| 91 | { |
| 92 | return NULL; |
| 93 | } |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 94 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 95 | ret = offset + 4; |
| 96 | *((unsigned int *)offset) = size; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 97 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 98 | offset += size + 4; |
| 99 | totalSize -= size + 4; |
| 100 | return ret; |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 101 | } |
| 102 | */ |
| 103 | |
| 104 | #define malloc(n) my_malloc(n) |
| 105 | void * my_malloc(int size) |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 106 | { |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 107 | return alloc(size); |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 108 | } |
| 109 | |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 110 | unsigned char readChar(int file) |
| 111 | { |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 112 | char buf[2]; |
| 113 | rb->read(file, &buf, 1); |
| 114 | return buf[0]; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 115 | } |
| 116 | |
| 117 | unsigned char * readData(int file, int len) |
| 118 | { |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 119 | unsigned char * dat = malloc(len); |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 120 | rb->read(file, dat, len); |
| 121 | return dat; |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 122 | } |
| 123 | |
| 124 | int eof(int fd) |
| 125 | { |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 126 | int curPos = rb->lseek(fd, 0, SEEK_CUR); |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 127 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 128 | int size = rb->lseek(fd, 0, SEEK_END); |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 129 | |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 130 | rb->lseek(fd, curPos, SEEK_SET); |
| 131 | return size+1 == rb->lseek(fd, 0, SEEK_CUR); |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 132 | } |
| 133 | |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 134 | // Here is a hacked up printf command to get the output from the game. |
| 135 | int printf(const char *fmt, ...) |
| 136 | { |
Stepan Moskovchenko | 47efba8 | 2006-05-03 05:18:18 +0000 | [diff] [blame] | 137 | static int p_xtpt = 0; |
Stepan Moskovchenko | b2f1b5d | 2006-05-01 23:22:59 +0000 | [diff] [blame] | 138 | char p_buf[50]; |
| 139 | bool ok; |
| 140 | va_list ap; |
| 141 | |
| 142 | va_start(ap, fmt); |
| 143 | ok = rb->vsnprintf(p_buf,sizeof(p_buf), fmt, ap); |
| 144 | va_end(ap); |
| 145 | |
| 146 | rb->lcd_putsxy(1,p_xtpt, (unsigned char *)p_buf); |
| 147 | rb->lcd_update(); |
| 148 | |
| 149 | p_xtpt+=8; |
| 150 | if(p_xtpt>LCD_HEIGHT-8) |
| 151 | { |
| 152 | p_xtpt=0; |
| 153 | rb->lcd_clear_display(); |
| 154 | } |
| 155 | return 1; |
| 156 | } |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 157 | |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 158 | void exit(int code) |
| 159 | { |
Stepan Moskovchenko | 9ec1ff8 | 2005-04-20 21:07:13 +0000 | [diff] [blame] | 160 | code = code; /* Stub function, kill warning for now */ |
Stepan Moskovchenko | 215e492 | 2005-04-15 06:08:55 +0000 | [diff] [blame] | 161 | } |
Nils Wallménius | 0e49605 | 2007-09-24 15:57:32 +0000 | [diff] [blame] | 162 | |