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:
Stepan Moskovchenko 2006-05-07 07:12:07 +00:00
parent a95068cf39
commit 68af7bae87
3 changed files with 69 additions and 18 deletions

View file

@ -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)
{

View file

@ -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;

View file

@ -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;