summaryrefslogtreecommitdiff
path: root/apps/plugins/midi/midiplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/midi/midiplay.c')
-rw-r--r--apps/plugins/midi/midiplay.c74
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
96struct MIDIfile * mf IBSS_ATTR; 105struct MIDIfile * mf IBSS_ATTR;
97 106
98int numberOfSamples IBSS_ATTR; /* the number of samples in the current tick */ 107int numberOfSamples IBSS_ATTR; /* the number of samples in the current tick */
108int playingTime IBSS_ATTR; /* How many seconds into the file have we been playing? */
109int samplesThisSecond IBSS_ATTR; /* How many samples produced during this second so far? */
110
111
99long bpm IBSS_ATTR; 112long bpm IBSS_ATTR;
100 113
101int32_t gmbuf[BUF_SIZE*NBUF]; 114int32_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