Added ability to adjust the volume during playback.
Gracefully fail if no soundset installed. Yet more messing with the ramping code. I swear, that will be the end of me. Basic skipping support- skip foreward a bit if Right is pressed. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9883 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
a95068cf39
commit
68af7bae87
3 changed files with 69 additions and 18 deletions
|
@ -68,8 +68,6 @@ struct MIDIfile * loadFile(char * filename)
|
|||
int track=0;
|
||||
|
||||
printf("\nFile has %d tracks.", mfload->numTracks);
|
||||
printf("Time division=%d\n", mfload->div);
|
||||
|
||||
|
||||
while(! eof(file) && track < mfload->numTracks)
|
||||
{
|
||||
|
|
|
@ -103,19 +103,20 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig)
|
|||
drumUsed[getEvent(mf->tracks[a], ts)->d1]=1;
|
||||
|
||||
if( (getEvent(mf->tracks[a], ts)->status & 0xF0) == MIDI_PRGM)
|
||||
{
|
||||
/* if(patchUsed[getEvent(mf->tracks[a], ts)->d1]==0)
|
||||
printf("\nI need to load patch %d.", getEvent(mf->tracks[a], ts)->d1);
|
||||
*/
|
||||
patchUsed[getEvent(mf->tracks[a], ts)->d1]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int file = rb->open(filename, O_RDONLY);
|
||||
if(file == -1)
|
||||
if(file < 0)
|
||||
{
|
||||
rb->splash(HZ*2, true, "Bad patch config.\nDid you install the patchset?");
|
||||
printf("\n");
|
||||
printf("\nNo MIDI patchset found.");
|
||||
printf("\nPlease install the instruments.");
|
||||
printf("\nSee Rockbox page for more info.");
|
||||
|
||||
rb->splash(HZ*2, true, "No Instruments");
|
||||
rb->splash(HZ*2, true, "No Instruments");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -148,7 +149,7 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig)
|
|||
rb->close(file);
|
||||
|
||||
file = rb->open(drumConfig, O_RDONLY);
|
||||
if(file == -1)
|
||||
if(file < 0)
|
||||
{
|
||||
rb->splash(HZ*2, true, "Bad drum config.\nDid you install the patchset?");
|
||||
return -1;
|
||||
|
|
|
@ -22,7 +22,7 @@ PLUGIN_HEADER
|
|||
|
||||
#define FRACTSIZE 10
|
||||
#define SAMPLE_RATE 22050 // 44100 22050 11025
|
||||
#define MAX_VOICES 13 // Note: 24 midi channels is the minimum general midi
|
||||
#define MAX_VOICES 14 // Note: 24 midi channels is the minimum general midi
|
||||
// spec implementation
|
||||
#define BUF_SIZE 512
|
||||
#define NBUF 2
|
||||
|
@ -161,13 +161,12 @@ void get_more(unsigned char** start, size_t* size)
|
|||
|
||||
int midimain(void * filename)
|
||||
{
|
||||
int button;
|
||||
|
||||
/* rb->splash(HZ/5, true, "LOADING MIDI"); */
|
||||
int notesUsed = 0;
|
||||
int a=0;
|
||||
printf("\nLoading file");
|
||||
mf= loadFile(filename);
|
||||
|
||||
/* rb->splash(HZ/5, true, "LOADING PATCHES"); */
|
||||
|
||||
if (initSynth(mf, "/.rockbox/patchset/patchset.cfg", "/.rockbox/patchset/drums.cfg") == -1)
|
||||
return -1;
|
||||
|
||||
|
@ -191,14 +190,25 @@ int midimain(void * filename)
|
|||
bpm=mf->div*1000000/tempo;
|
||||
numberOfSamples=SAMPLE_RATE/bpm;
|
||||
|
||||
tick();
|
||||
|
||||
|
||||
/* Skip over any junk in the beginning of the file, so start playing */
|
||||
/* after the first note event */
|
||||
do
|
||||
{
|
||||
notesUsed = 0;
|
||||
for(a=0; a<MAX_VOICES; a++)
|
||||
if(voices[a].isUsed == 1)
|
||||
notesUsed++;
|
||||
tick();
|
||||
} while(notesUsed == 0);
|
||||
|
||||
synthbuf();
|
||||
#ifndef SIMULATOR
|
||||
rb->pcm_play_data(&get_more, NULL, 0);
|
||||
#endif
|
||||
|
||||
button=rb->button_status();
|
||||
int vol=0;
|
||||
|
||||
while(!quit)
|
||||
{
|
||||
|
@ -206,7 +216,49 @@ int midimain(void * filename)
|
|||
synthbuf();
|
||||
#endif
|
||||
rb->yield();
|
||||
if(rb->button_status()!=button) quit=1;
|
||||
|
||||
/* Code taken from Oscilloscope plugin */
|
||||
switch(rb->button_get(false))
|
||||
{
|
||||
case BUTTON_UP:
|
||||
case BUTTON_UP | BUTTON_REPEAT:
|
||||
vol = rb->global_settings->volume;
|
||||
if (vol < rb->sound_max(SOUND_VOLUME))
|
||||
{
|
||||
vol++;
|
||||
rb->sound_set(SOUND_VOLUME, vol);
|
||||
rb->global_settings->volume = vol;
|
||||
}
|
||||
break;
|
||||
|
||||
case BUTTON_DOWN:
|
||||
case BUTTON_DOWN | BUTTON_REPEAT:
|
||||
vol = rb->global_settings->volume;
|
||||
if (vol > rb->sound_min(SOUND_VOLUME))
|
||||
{
|
||||
vol--;
|
||||
rb->sound_set(SOUND_VOLUME, vol);
|
||||
rb->global_settings->volume = vol;
|
||||
}
|
||||
break;
|
||||
|
||||
case BUTTON_RIGHT:
|
||||
{
|
||||
/* Skip 3 seconds */
|
||||
/* Should skip length be retrieved from the RB settings? */
|
||||
int samp = 3*SAMPLE_RATE;
|
||||
int tickCount = samp / numberOfSamples;
|
||||
int a=0;
|
||||
for(a=0; a<tickCount; a++)
|
||||
tick();
|
||||
break;
|
||||
}
|
||||
|
||||
case BUTTON_OFF:
|
||||
quit=1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue