1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Stepan Moskovchenko 2007-11-05 05:35:10 +00:00
parent 47eb569b62
commit bdfe87c0f1
3 changed files with 71 additions and 63 deletions

View file

@ -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 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? */ int samplesThisSecond IBSS_ATTR; /* How many samples produced during this second so far? */
long bpm IBSS_ATTR; long bpm IBSS_ATTR;
int32_t gmbuf[BUF_SIZE*NBUF]; int32_t gmbuf[BUF_SIZE*NBUF];
@ -123,6 +122,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{ {
int retval = 0; int retval = 0;
PLUGIN_IRAM_INIT(api) PLUGIN_IRAM_INIT(api)
rb = api; rb = api;
@ -317,66 +317,16 @@ static int midimain(void * filename)
/* Rewinding is tricky. Basically start the file over */ /* Rewinding is tricky. Basically start the file over */
/* but run through the tracks without the synth running */ /* but run through the tracks without the synth running */
rb->pcm_play_stop(); rb->pcm_play_stop();
seekBackward(5);
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();
rb->pcm_play_data(&get_more, NULL, 0); rb->pcm_play_data(&get_more, NULL, 0);
break; break;
} }
case BTN_RIGHT: 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(); rb->pcm_play_stop();
seekForward(5);
for(a=0; a<tickCount; a++)
tick();
rb->pcm_play_data(&get_more, NULL, 0); rb->pcm_play_data(&get_more, NULL, 0);
break; break;
} }

View file

@ -142,7 +142,6 @@ const uint32_t pitchTbl[] ICONST_ATTR={
static void findDelta(struct SynthObject * so, int ch, int note) static void findDelta(struct SynthObject * so, int ch, int note)
{ {
struct GWaveform * wf = patchSet[chPat[ch]]->waveforms[patchSet[chPat[ch]]->noteTable[note]]; struct GWaveform * wf = patchSet[chPat[ch]]->waveforms[patchSet[chPat[ch]]->noteTable[note]];
so->wf=wf; so->wf=wf;
unsigned int delta= 0; unsigned int delta= 0;
@ -152,6 +151,18 @@ static void findDelta(struct SynthObject * so, int ch, int note)
so->delta = delta; so->delta = delta;
} }
static inline void computeDeltas(int ch)
{
int a=0;
for(a = 0; a<MAX_VOICES; a++)
{
if(voices[a].isUsed==1 && voices[a].ch == ch)
{
findDelta(&voices[a], ch, voices[a].note);
}
}
}
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; chPW[ch] = msb<<2|lsb>>5;
@ -160,14 +171,7 @@ static inline void setPW(int ch, int msb, int lsb)
chPBNoteOffset[ch] = totalBend >> 8; chPBNoteOffset[ch] = totalBend >> 8;
chPBFractBend[ch] = pitchTbl[(totalBend & 0xFF) + 256]; chPBFractBend[ch] = pitchTbl[(totalBend & 0xFF) + 256];
int a=0; computeDeltas(ch);
for(a = 0; a<MAX_VOICES; a++)
{
if(voices[a].isUsed==1 && voices[a].ch == ch)
{
findDelta(&voices[a], ch, voices[a].note);
}
}
} }
inline void pressNote(int ch, int note, int vol) inline void pressNote(int ch, int note, int vol)
@ -376,7 +380,58 @@ void rewindFile(void)
} }
} }
int tick(void) ICODE_ATTR; 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) int tick(void)
{ {
if(mf==NULL) if(mf==NULL)

View file

@ -23,5 +23,8 @@ int tick(void);
void pressNote(int ch, int note, int vol); void pressNote(int ch, int note, int vol);
void rewindFile(void); void rewindFile(void);
void seekForward(int nSec);
void seekBackward(int nSec);
extern long tempo; extern long tempo;