summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorStepan Moskovchenko <stevenm@rockbox.org>2007-11-05 05:35:10 +0000
committerStepan Moskovchenko <stevenm@rockbox.org>2007-11-05 05:35:10 +0000
commitbdfe87c0f11c152e95cb9034d50cd97e94e7be72 (patch)
tree27e751300789c9c381891500e2d839433c48c280 /apps
parent47eb569b624ffa89756b121603ef315a19ffde22 (diff)
downloadrockbox-bdfe87c0f11c152e95cb9034d50cd97e94e7be72.zip
rockbox-bdfe87c0f11c152e95cb9034d50cd97e94e7be72.tar.gz
rockbox-bdfe87c0f11c152e95cb9034d50cd97e94e7be72.tar.bz2
rockbox-bdfe87c0f11c152e95cb9034d50cd97e94e7be72.tar.xz
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
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/midi/midiplay.c58
-rw-r--r--apps/plugins/midi/sequencer.c71
-rw-r--r--apps/plugins/midi/sequencer.h3
3 files changed, 70 insertions, 62 deletions
diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c
index c69c8b1..cc87463 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; a<MAX_VOICES; a++)
- if(voices[a].isUsed == 1)
- notesUsed++;
- tick();
- } while(notesUsed == 0);
-
- /* Reset the time counter to 0 */
- playingTime = 0;
- samplesThisSecond = 0;
-
-
-
- /* Tick until goal is reached */
- while(playingTime < desiredTime)
- tick();
-
+ seekBackward(5);
rb->pcm_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; a<tickCount; a++)
- tick();
+ seekForward(5);
rb->pcm_play_data(&get_more, NULL, 0);
break;
}
diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c
index b9cc83f..4e6c15f 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<MAX_VOICES; a++)
{
@@ -170,6 +163,17 @@ static inline void setPW(int ch, int msb, int lsb)
}
}
+static inline void setPW(int ch, int msb, int lsb)
+{
+ chPW[ch] = msb<<2|lsb>>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<MAX_VOICES; a++)
+ if(voices[a].isUsed == 1)
+ notesUsed++;
+ tick();
+ } while(notesUsed == 0);
+
+ /* Reset the time counter to 0 */
+ playingTime = 0;
+ samplesThisSecond = 0;
+
+ /* Tick until goal is reached */
+ while(playingTime < desiredTime)
+ tick();
+}
+
+
+void seekForward(int nsec)
+{
+ int desiredTime = playingTime + nsec;
+ while(tick() && playingTime < desiredTime);
+}
+
int tick(void)
{
if(mf==NULL)
diff --git a/apps/plugins/midi/sequencer.h b/apps/plugins/midi/sequencer.h
index 8cb1904..0c90d70 100644
--- a/apps/plugins/midi/sequencer.h
+++ b/apps/plugins/midi/sequencer.h
@@ -23,5 +23,8 @@ int tick(void);
void pressNote(int ch, int note, int vol);
void rewindFile(void);
+void seekForward(int nSec);
+void seekBackward(int nSec);
+
extern long tempo;