diff options
Diffstat (limited to 'apps/plugins/midi/midiplay.c')
-rw-r--r-- | apps/plugins/midi/midiplay.c | 74 |
1 files changed, 72 insertions, 2 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 |