From bdfe87c0f11c152e95cb9034d50cd97e94e7be72 Mon Sep 17 00:00:00 2001 From: Stepan Moskovchenko Date: Mon, 5 Nov 2007 05:35:10 +0000 Subject: MIDI: Make seeking neater by moving it into another file. Will be more useful later. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15467 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/midi/midiplay.c | 58 +++-------------------------------- apps/plugins/midi/sequencer.c | 71 ++++++++++++++++++++++++++++++++++++++----- apps/plugins/midi/sequencer.h | 3 ++ 3 files changed, 70 insertions(+), 62 deletions(-) diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index c69c8b1ad6..cc8746308f 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -108,7 +108,6 @@ int numberOfSamples IBSS_ATTR; /* the number of samples in the current tick */ int playingTime IBSS_ATTR; /* How many seconds into the file have we been playing? */ int samplesThisSecond IBSS_ATTR; /* How many samples produced during this second so far? */ - long bpm IBSS_ATTR; int32_t gmbuf[BUF_SIZE*NBUF]; @@ -123,6 +122,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int retval = 0; + PLUGIN_IRAM_INIT(api) rb = api; @@ -317,66 +317,16 @@ static int midimain(void * filename) /* Rewinding is tricky. Basically start the file over */ /* but run through the tracks without the synth running */ rb->pcm_play_stop(); - - int desiredTime = playingTime - 5; /* Rewind 5 sec */ - - if(desiredTime < 0) - desiredTime = 0; - - /* Set controllers to default values */ - resetControllers(); - - /* Set the tempo to defalt */ - bpm=mf->div*1000000/tempo; - numberOfSamples=SAMPLE_RATE/bpm; - - - /* Reset the tracks to start */ - rewindFile(); - - /* Reset the time counter to 0 */ - playingTime = 0; - samplesThisSecond = 0; - - /* Quickly run through any initial things that occur before notes */ - do - { - notesUsed = 0; - for(a=0; apcm_play_data(&get_more, NULL, 0); + break; } case BTN_RIGHT: { - /* Skip 5 seconds forward */ - /* Skipping forward is easy */ - /* Should skip length be retrieved from the RB settings? */ - int samp = 5*SAMPLE_RATE; - - /* Have the issue where numberOfSamples changes within this tick */ - int tickCount = samp / numberOfSamples; - int a=0; - rb->pcm_play_stop(); - - for(a=0; apcm_play_data(&get_more, NULL, 0); break; } diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c index b9cc83f9ad..4e6c15fba6 100644 --- a/apps/plugins/midi/sequencer.c +++ b/apps/plugins/midi/sequencer.c @@ -142,7 +142,6 @@ const uint32_t pitchTbl[] ICONST_ATTR={ static void findDelta(struct SynthObject * so, int ch, int note) { - struct GWaveform * wf = patchSet[chPat[ch]]->waveforms[patchSet[chPat[ch]]->noteTable[note]]; so->wf=wf; unsigned int delta= 0; @@ -152,14 +151,8 @@ static void findDelta(struct SynthObject * so, int ch, int note) so->delta = delta; } -static inline void setPW(int ch, int msb, int lsb) +static inline void computeDeltas(int ch) { - chPW[ch] = msb<<2|lsb>>5; - - int totalBend = (chPW[ch]-256) * chPBDepth[ch]; - chPBNoteOffset[ch] = totalBend >> 8; - chPBFractBend[ch] = pitchTbl[(totalBend & 0xFF) + 256]; - int a=0; for(a = 0; a>5; + + int totalBend = (chPW[ch]-256) * chPBDepth[ch]; + chPBNoteOffset[ch] = totalBend >> 8; + chPBFractBend[ch] = pitchTbl[(totalBend & 0xFF) + 256]; + + computeDeltas(ch); +} + inline void pressNote(int ch, int note, int vol) { static int lastKill = 0; @@ -376,7 +380,58 @@ void rewindFile(void) } } + int tick(void) ICODE_ATTR; + +void seekBackward(int nsec) +{ + int notesUsed = 0, a=0; + int desiredTime = playingTime - nsec; /* Rewind 5 sec */ + + if(desiredTime < 0) + desiredTime = 0; + + /* Set controllers to default values */ + resetControllers(); + + /* Set the tempo to defalt */ + bpm=mf->div*1000000/tempo; + numberOfSamples=SAMPLE_RATE/bpm; + + + /* Reset the tracks to start */ + rewindFile(); + + /* Reset the time counter to 0 */ + playingTime = 0; + samplesThisSecond = 0; + + /* Quickly run through any initial things that occur before notes */ + do + { + notesUsed = 0; + for(a=0; a