summaryrefslogtreecommitdiff
path: root/apps/plugins/midiplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/midiplay.c')
-rw-r--r--apps/plugins/midiplay.c68
1 files changed, 60 insertions, 8 deletions
diff --git a/apps/plugins/midiplay.c b/apps/plugins/midiplay.c
index d420508473..70ffaa7d92 100644
--- a/apps/plugins/midiplay.c
+++ b/apps/plugins/midiplay.c
@@ -22,7 +22,7 @@ PLUGIN_HEADER
22 22
23#define FRACTSIZE 10 23#define FRACTSIZE 10
24#define SAMPLE_RATE 22050 // 44100 22050 11025 24#define SAMPLE_RATE 22050 // 44100 22050 11025
25#define MAX_VOICES 13 // Note: 24 midi channels is the minimum general midi 25#define MAX_VOICES 14 // Note: 24 midi channels is the minimum general midi
26 // spec implementation 26 // spec implementation
27#define BUF_SIZE 512 27#define BUF_SIZE 512
28#define NBUF 2 28#define NBUF 2
@@ -161,13 +161,12 @@ void get_more(unsigned char** start, size_t* size)
161 161
162int midimain(void * filename) 162int midimain(void * filename)
163{ 163{
164 int button; 164 int notesUsed = 0;
165 165 int a=0;
166 /* rb->splash(HZ/5, true, "LOADING MIDI"); */
167 printf("\nLoading file"); 166 printf("\nLoading file");
168 mf= loadFile(filename); 167 mf= loadFile(filename);
169 168
170 /* rb->splash(HZ/5, true, "LOADING PATCHES"); */ 169
171 if (initSynth(mf, "/.rockbox/patchset/patchset.cfg", "/.rockbox/patchset/drums.cfg") == -1) 170 if (initSynth(mf, "/.rockbox/patchset/patchset.cfg", "/.rockbox/patchset/drums.cfg") == -1)
172 return -1; 171 return -1;
173 172
@@ -191,14 +190,25 @@ int midimain(void * filename)
191 bpm=mf->div*1000000/tempo; 190 bpm=mf->div*1000000/tempo;
192 numberOfSamples=SAMPLE_RATE/bpm; 191 numberOfSamples=SAMPLE_RATE/bpm;
193 192
194 tick(); 193
194
195 /* Skip over any junk in the beginning of the file, so start playing */
196 /* after the first note event */
197 do
198 {
199 notesUsed = 0;
200 for(a=0; a<MAX_VOICES; a++)
201 if(voices[a].isUsed == 1)
202 notesUsed++;
203 tick();
204 } while(notesUsed == 0);
195 205
196 synthbuf(); 206 synthbuf();
197#ifndef SIMULATOR 207#ifndef SIMULATOR
198 rb->pcm_play_data(&get_more, NULL, 0); 208 rb->pcm_play_data(&get_more, NULL, 0);
199#endif 209#endif
200 210
201 button=rb->button_status(); 211 int vol=0;
202 212
203 while(!quit) 213 while(!quit)
204 { 214 {
@@ -206,7 +216,49 @@ int midimain(void * filename)
206 synthbuf(); 216 synthbuf();
207 #endif 217 #endif
208 rb->yield(); 218 rb->yield();
209 if(rb->button_status()!=button) quit=1; 219
220 /* Code taken from Oscilloscope plugin */
221 switch(rb->button_get(false))
222 {
223 case BUTTON_UP:
224 case BUTTON_UP | BUTTON_REPEAT:
225 vol = rb->global_settings->volume;
226 if (vol < rb->sound_max(SOUND_VOLUME))
227 {
228 vol++;
229 rb->sound_set(SOUND_VOLUME, vol);
230 rb->global_settings->volume = vol;
231 }
232 break;
233
234 case BUTTON_DOWN:
235 case BUTTON_DOWN | BUTTON_REPEAT:
236 vol = rb->global_settings->volume;
237 if (vol > rb->sound_min(SOUND_VOLUME))
238 {
239 vol--;
240 rb->sound_set(SOUND_VOLUME, vol);
241 rb->global_settings->volume = vol;
242 }
243 break;
244
245 case BUTTON_RIGHT:
246 {
247 /* Skip 3 seconds */
248 /* Should skip length be retrieved from the RB settings? */
249 int samp = 3*SAMPLE_RATE;
250 int tickCount = samp / numberOfSamples;
251 int a=0;
252 for(a=0; a<tickCount; a++)
253 tick();
254 break;
255 }
256
257 case BUTTON_OFF:
258 quit=1;
259 }
260
261
210 } 262 }
211 263
212 return 0; 264 return 0;