diff options
-rw-r--r-- | apps/plugins/midi/midiplay.c | 74 | ||||
-rw-r--r-- | apps/plugins/midi/sequencer.c | 23 | ||||
-rw-r--r-- | apps/plugins/midi/sequencer.h | 1 | ||||
-rw-r--r-- | apps/plugins/midi/synth.c | 18 | ||||
-rw-r--r-- | apps/plugins/midi/synth.h | 2 |
5 files changed, 110 insertions, 8 deletions
diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index a5ecfdf1f7..e1710e8eac 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c | |||
@@ -32,18 +32,21 @@ PLUGIN_IRAM_DECLARE | |||
32 | #define BTN_RIGHT BUTTON_RIGHT | 32 | #define BTN_RIGHT BUTTON_RIGHT |
33 | #define BTN_UP BUTTON_UP | 33 | #define BTN_UP BUTTON_UP |
34 | #define BTN_DOWN BUTTON_DOWN | 34 | #define BTN_DOWN BUTTON_DOWN |
35 | #define BTN_LEFT BUTTON_LEFT | ||
35 | 36 | ||
36 | #elif CONFIG_KEYPAD == ONDIO_PAD | 37 | #elif CONFIG_KEYPAD == ONDIO_PAD |
37 | #define BTN_QUIT BUTTON_OFF | 38 | #define BTN_QUIT BUTTON_OFF |
38 | #define BTN_RIGHT BUTTON_RIGHT | 39 | #define BTN_RIGHT BUTTON_RIGHT |
39 | #define BTN_UP BUTTON_UP | 40 | #define BTN_UP BUTTON_UP |
40 | #define BTN_DOWN BUTTON_DOWN | 41 | #define BTN_DOWN BUTTON_DOWN |
42 | #define BTN_LEFT BUTTON_LEFT | ||
41 | 43 | ||
42 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) | 44 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) |
43 | #define BTN_QUIT BUTTON_OFF | 45 | #define BTN_QUIT BUTTON_OFF |
44 | #define BTN_RIGHT BUTTON_RIGHT | 46 | #define BTN_RIGHT BUTTON_RIGHT |
45 | #define BTN_UP BUTTON_UP | 47 | #define BTN_UP BUTTON_UP |
46 | #define BTN_DOWN BUTTON_DOWN | 48 | #define BTN_DOWN BUTTON_DOWN |
49 | #define BTN_LEFT BUTTON_LEFT | ||
47 | 50 | ||
48 | #define BTN_RC_QUIT BUTTON_RC_STOP | 51 | #define BTN_RC_QUIT BUTTON_RC_STOP |
49 | 52 | ||
@@ -51,12 +54,14 @@ PLUGIN_IRAM_DECLARE | |||
51 | (CONFIG_KEYPAD == IPOD_1G2G_PAD) | 54 | (CONFIG_KEYPAD == IPOD_1G2G_PAD) |
52 | #define BTN_QUIT (BUTTON_SELECT | BUTTON_MENU) | 55 | #define BTN_QUIT (BUTTON_SELECT | BUTTON_MENU) |
53 | #define BTN_RIGHT BUTTON_RIGHT | 56 | #define BTN_RIGHT BUTTON_RIGHT |
57 | #define BTN_LEFT BUTTON_LEFT | ||
54 | #define BTN_UP BUTTON_SCROLL_FWD | 58 | #define BTN_UP BUTTON_SCROLL_FWD |
55 | #define BTN_DOWN BUTTON_SCROLL_BACK | 59 | #define BTN_DOWN BUTTON_SCROLL_BACK |
56 | 60 | ||
57 | #elif (CONFIG_KEYPAD == GIGABEAT_PAD) | 61 | #elif (CONFIG_KEYPAD == GIGABEAT_PAD) |
58 | #define BTN_QUIT BUTTON_POWER | 62 | #define BTN_QUIT BUTTON_POWER |
59 | #define BTN_RIGHT BUTTON_RIGHT | 63 | #define BTN_RIGHT BUTTON_RIGHT |
64 | #define BTN_LEFT BUTTON_LEFT | ||
60 | #define BTN_UP BUTTON_UP | 65 | #define BTN_UP BUTTON_UP |
61 | #define BTN_DOWN BUTTON_DOWN | 66 | #define BTN_DOWN BUTTON_DOWN |
62 | 67 | ||
@@ -64,24 +69,28 @@ PLUGIN_IRAM_DECLARE | |||
64 | (CONFIG_KEYPAD == SANSA_C200_PAD) | 69 | (CONFIG_KEYPAD == SANSA_C200_PAD) |
65 | #define BTN_QUIT BUTTON_POWER | 70 | #define BTN_QUIT BUTTON_POWER |
66 | #define BTN_RIGHT BUTTON_RIGHT | 71 | #define BTN_RIGHT BUTTON_RIGHT |
72 | #define BTN_LEFT BUTTON_LEFT | ||
67 | #define BTN_UP BUTTON_UP | 73 | #define BTN_UP BUTTON_UP |
68 | #define BTN_DOWN BUTTON_DOWN | 74 | #define BTN_DOWN BUTTON_DOWN |
69 | 75 | ||
70 | #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD | 76 | #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD |
71 | #define BTN_QUIT BUTTON_POWER | 77 | #define BTN_QUIT BUTTON_POWER |
72 | #define BTN_RIGHT BUTTON_RIGHT | 78 | #define BTN_RIGHT BUTTON_RIGHT |
79 | #define BTN_LEFT BUTTON_LEFT | ||
73 | #define BTN_UP BUTTON_UP | 80 | #define BTN_UP BUTTON_UP |
74 | #define BTN_DOWN BUTTON_DOWN | 81 | #define BTN_DOWN BUTTON_DOWN |
75 | 82 | ||
76 | #elif CONFIG_KEYPAD == IRIVER_H10_PAD | 83 | #elif CONFIG_KEYPAD == IRIVER_H10_PAD |
77 | #define BTN_QUIT BUTTON_POWER | 84 | #define BTN_QUIT BUTTON_POWER |
78 | #define BTN_RIGHT BUTTON_RIGHT | 85 | #define BTN_RIGHT BUTTON_RIGHT |
86 | #define BTN_LEFT BUTTON_LEFT | ||
79 | #define BTN_UP BUTTON_SCROLL_UP | 87 | #define BTN_UP BUTTON_SCROLL_UP |
80 | #define BTN_DOWN BUTTON_SCROLL_DOWN | 88 | #define BTN_DOWN BUTTON_SCROLL_DOWN |
81 | 89 | ||
82 | #elif CONFIG_KEYPAD == MROBE500_PAD | 90 | #elif CONFIG_KEYPAD == MROBE500_PAD |
83 | #define BTN_QUIT BUTTON_POWER | 91 | #define BTN_QUIT BUTTON_POWER |
84 | #define BTN_RIGHT BUTTON_RIGHT | 92 | #define BTN_RIGHT BUTTON_RIGHT |
93 | #define BTN_LEFT BUTTON_LEFT | ||
85 | #define BTN_UP BUTTON_RC_PLAY | 94 | #define BTN_UP BUTTON_RC_PLAY |
86 | #define BTN_DOWN BUTTON_RC_DOWN | 95 | #define BTN_DOWN BUTTON_RC_DOWN |
87 | 96 | ||
@@ -96,6 +105,10 @@ PLUGIN_IRAM_DECLARE | |||
96 | struct MIDIfile * mf IBSS_ATTR; | 105 | struct MIDIfile * mf IBSS_ATTR; |
97 | 106 | ||
98 | int numberOfSamples IBSS_ATTR; /* the number of samples in the current tick */ | 107 | int numberOfSamples IBSS_ATTR; /* the number of samples in the current tick */ |
108 | int playingTime IBSS_ATTR; /* How many seconds into the file have we been playing? */ | ||
109 | int samplesThisSecond IBSS_ATTR; /* How many samples produced during this second so far? */ | ||
110 | |||
111 | |||
99 | long bpm IBSS_ATTR; | 112 | long bpm IBSS_ATTR; |
100 | 113 | ||
101 | int32_t gmbuf[BUF_SIZE*NBUF]; | 114 | int32_t gmbuf[BUF_SIZE*NBUF]; |
@@ -255,6 +268,9 @@ static int midimain(void * filename) | |||
255 | tick(); | 268 | tick(); |
256 | } while(notesUsed == 0); | 269 | } while(notesUsed == 0); |
257 | 270 | ||
271 | playingTime = 0; | ||
272 | samplesThisSecond = 0; | ||
273 | |||
258 | synthbuf(); | 274 | synthbuf(); |
259 | rb->pcm_play_data(&get_more, NULL, 0); | 275 | rb->pcm_play_data(&get_more, NULL, 0); |
260 | 276 | ||
@@ -295,17 +311,71 @@ static int midimain(void * filename) | |||
295 | } | 311 | } |
296 | break; | 312 | break; |
297 | 313 | ||
314 | |||
315 | case BTN_LEFT: | ||
316 | { | ||
317 | /* Rewinding is tricky. Basically start the file over */ | ||
318 | /* but run through the tracks without the synth running */ | ||
319 | |||
320 | int desiredTime = playingTime - 5; /* Rewind 5 sec */ | ||
321 | |||
322 | if(desiredTime < 0) | ||
323 | desiredTime = 0; | ||
324 | |||
325 | /* Set controllers to default values */ | ||
326 | resetControllers(); | ||
327 | |||
328 | /* Set the tempo to defalt */ | ||
329 | bpm=mf->div*1000000/tempo; | ||
330 | numberOfSamples=SAMPLE_RATE/bpm; | ||
331 | |||
332 | |||
333 | /* Reset the tracks to start */ | ||
334 | rewindFile(); | ||
335 | |||
336 | /* Reset the time counter to 0 */ | ||
337 | playingTime = 0; | ||
338 | samplesThisSecond = 0; | ||
339 | |||
340 | /* Quickly run through any initial things that occur before notes */ | ||
341 | do | ||
342 | { | ||
343 | notesUsed = 0; | ||
344 | for(a=0; a<MAX_VOICES; a++) | ||
345 | if(voices[a].isUsed == 1) | ||
346 | notesUsed++; | ||
347 | tick(); | ||
348 | } while(notesUsed == 0); | ||
349 | |||
350 | /* Reset the time counter to 0 */ | ||
351 | playingTime = 0; | ||
352 | samplesThisSecond = 0; | ||
353 | |||
354 | |||
355 | |||
356 | /* Tick until goal is reached */ | ||
357 | while(playingTime < desiredTime) | ||
358 | tick(); | ||
359 | |||
360 | break; | ||
361 | } | ||
362 | |||
298 | case BTN_RIGHT: | 363 | case BTN_RIGHT: |
299 | { | 364 | { |
300 | /* Skip 3 seconds */ | 365 | /* Skip 5 seconds forward */ |
366 | /* Skipping forward is easy */ | ||
301 | /* Should skip length be retrieved from the RB settings? */ | 367 | /* Should skip length be retrieved from the RB settings? */ |
302 | int samp = 3*SAMPLE_RATE; | 368 | int samp = 5*SAMPLE_RATE; |
369 | |||
370 | /* Have the issue where numberOfSamples changes within this tick */ | ||
303 | int tickCount = samp / numberOfSamples; | 371 | int tickCount = samp / numberOfSamples; |
304 | int a=0; | 372 | int a=0; |
305 | for(a=0; a<tickCount; a++) | 373 | for(a=0; a<tickCount; a++) |
306 | tick(); | 374 | tick(); |
307 | break; | 375 | break; |
308 | } | 376 | } |
377 | |||
378 | |||
309 | #ifdef BTN_RC_QUIT | 379 | #ifdef BTN_RC_QUIT |
310 | case BTN_RC_QUIT: | 380 | case BTN_RC_QUIT: |
311 | #endif | 381 | #endif |
diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c index c4ddfcf95a..f0af3fecd0 100644 --- a/apps/plugins/midi/sequencer.c +++ b/apps/plugins/midi/sequencer.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include "synth.h" | 22 | #include "synth.h" |
23 | 23 | ||
24 | extern struct plugin_api * rb; | 24 | extern struct plugin_api * rb; |
25 | extern int playingTime IBSS_ATTR; | ||
26 | extern int samplesThisSecond IBSS_ATTR; | ||
25 | 27 | ||
26 | long tempo=375000; | 28 | long tempo=375000; |
27 | 29 | ||
@@ -239,7 +241,7 @@ inline void pressNote(int ch, int note, int vol) | |||
239 | { | 241 | { |
240 | if(drumSet[note]!=NULL) | 242 | if(drumSet[note]!=NULL) |
241 | { | 243 | { |
242 | if(note<35) | 244 | if(note<35) |
243 | printf("NOTE LESS THAN 35, AND A DRUM PATCH EXISTS FOR THIS? WHAT THE HELL?"); | 245 | printf("NOTE LESS THAN 35, AND A DRUM PATCH EXISTS FOR THIS? WHAT THE HELL?"); |
244 | 246 | ||
245 | struct GWaveform * wf = drumSet[note]->waveforms[0]; | 247 | struct GWaveform * wf = drumSet[note]->waveforms[0]; |
@@ -364,6 +366,16 @@ static void sendEvent(struct Event * ev) | |||
364 | } | 366 | } |
365 | } | 367 | } |
366 | 368 | ||
369 | void rewindFile() | ||
370 | { | ||
371 | int i=0; | ||
372 | for(i=0; i<mf->numTracks; i++) | ||
373 | { | ||
374 | mf->tracks[i]->delta = 0; | ||
375 | mf->tracks[i]->pos = 0; | ||
376 | } | ||
377 | } | ||
378 | |||
367 | int tick(void) ICODE_ATTR; | 379 | int tick(void) ICODE_ATTR; |
368 | int tick(void) | 380 | int tick(void) |
369 | { | 381 | { |
@@ -419,6 +431,15 @@ int tick(void) | |||
419 | } | 431 | } |
420 | } | 432 | } |
421 | 433 | ||
434 | samplesThisSecond += numberOfSamples; | ||
435 | |||
436 | while(samplesThisSecond >= SAMPLE_RATE) | ||
437 | { | ||
438 | samplesThisSecond -= SAMPLE_RATE; | ||
439 | playingTime++; | ||
440 | // printf("Time: %d sec\n", playingTime); | ||
441 | } | ||
442 | |||
422 | if(tracksAdv != 0) | 443 | if(tracksAdv != 0) |
423 | return 1; | 444 | return 1; |
424 | else | 445 | else |
diff --git a/apps/plugins/midi/sequencer.h b/apps/plugins/midi/sequencer.h index 3d05d4c8dd..0a70b98a1b 100644 --- a/apps/plugins/midi/sequencer.h +++ b/apps/plugins/midi/sequencer.h | |||
@@ -21,6 +21,7 @@ int tick(void); | |||
21 | 21 | ||
22 | /* used by beatbox */ | 22 | /* used by beatbox */ |
23 | void pressNote(int ch, int note, int vol); | 23 | void pressNote(int ch, int note, int vol); |
24 | void rewindFile(); | ||
24 | 25 | ||
25 | extern long tempo; | 26 | extern long tempo; |
26 | 27 | ||
diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index 4e04975e0b..ca59c76a8b 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c | |||
@@ -43,12 +43,8 @@ void readTextBlock(int file, char * buf) | |||
43 | rb->lseek(file, -1, SEEK_CUR); | 43 | rb->lseek(file, -1, SEEK_CUR); |
44 | } | 44 | } |
45 | 45 | ||
46 | /* Filename is the name of the config file */ | 46 | void resetControllers() |
47 | /* The MIDI file should have been loaded at this point */ | ||
48 | int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig) | ||
49 | { | 47 | { |
50 | char patchUsed[128]; | ||
51 | char drumUsed[128]; | ||
52 | int a=0; | 48 | int a=0; |
53 | for(a=0; a<MAX_VOICES; a++) | 49 | for(a=0; a<MAX_VOICES; a++) |
54 | { | 50 | { |
@@ -71,6 +67,18 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig) | |||
71 | chLastCtrlMSB[a]=0; /* Set to pitch bend depth */ | 67 | chLastCtrlMSB[a]=0; /* Set to pitch bend depth */ |
72 | chLastCtrlLSB[a]=0; /* Set to pitch bend depth */ | 68 | chLastCtrlLSB[a]=0; /* Set to pitch bend depth */ |
73 | } | 69 | } |
70 | } | ||
71 | |||
72 | /* Filename is the name of the config file */ | ||
73 | /* The MIDI file should have been loaded at this point */ | ||
74 | int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig) | ||
75 | { | ||
76 | char patchUsed[128]; | ||
77 | char drumUsed[128]; | ||
78 | int a=0; | ||
79 | |||
80 | resetControllers(); | ||
81 | |||
74 | for(a=0; a<128; a++) | 82 | for(a=0; a<128; a++) |
75 | { | 83 | { |
76 | patchSet[a]=NULL; | 84 | patchSet[a]=NULL; |
diff --git a/apps/plugins/midi/synth.h b/apps/plugins/midi/synth.h index 5f9edf89e5..aaaf2bbd74 100644 --- a/apps/plugins/midi/synth.h +++ b/apps/plugins/midi/synth.h | |||
@@ -20,6 +20,8 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig); | |||
20 | void setPoint(struct SynthObject * so, int pt); | 20 | void setPoint(struct SynthObject * so, int pt); |
21 | void synthSamples(int32_t *buf_ptr, unsigned int num_samples); | 21 | void synthSamples(int32_t *buf_ptr, unsigned int num_samples); |
22 | 22 | ||
23 | void resetControllers(); | ||
24 | |||
23 | static inline struct Event * getEvent(struct Track * tr, int evNum) | 25 | static inline struct Event * getEvent(struct Track * tr, int evNum) |
24 | { | 26 | { |
25 | return tr->dataBlock + (evNum*sizeof(struct Event)); | 27 | return tr->dataBlock + (evNum*sizeof(struct Event)); |