static void UltraPlayer(void) { int i, t, control; unsigned int start; struct VOICE *voice; md_player(); for (t = 0; t < md_numchn; t++) { voice = &voices[t]; if (voice->kick) { voice->kick = 0; if (voice->start > 0) gus_do_voice_start_position(t, voice->handle, voice->freq, voice->vol << 8, voice->pan << 6, voice->start << 4); else gus_do_voice_start(t, voice->handle, voice->freq, voice->vol << 8, voice->pan << 6); } else { if (voice->changes & CH_FREQ) gus_do_voice_frequency(t, voice->freq); if (voice->changes & CH_VOL); gus_do_voice_volume(t, voice->vol << 8); if (voice->changes & CH_PAN) gus_do_voice_pan(t, voice->pan << 6); } voice->changes = 0; } gus_do_wait(1); }
void VC_WriteSamples(char *buf,UWORD todo) { int t; UWORD part; while(todo>0){ if(TICKLEFT==0){ md_player(); TICKLEFT=(125L*md_mixfreq)/(50L*md_bpm); /* compute volume, frequency counter & panning parameters for each channel. */ for(t=0;t<md_numchn;t++){ int pan,vol,lvol,rvol; if(vinf[t].kick){ vinf[t].current=(vinf[t].start << FRACBITS); vinf[t].active=1; vinf[t].kick=0; } if(vinf[t].frq==0) vinf[t].active=0; if(vinf[t].active){ vinf[t].increment=fraction2long(vinf[t].frq,md_mixfreq); if(vinf[t].flags & SF_REVERSE) vinf[t].increment=-vinf[t].increment; vol=vinf[t].vol; pan=vinf[t].pan; if(md_mode & DMODE_STEREO){ lvol= ( vol * (255-pan) ) / 255; rvol= ( vol * pan ) / 255; vinf[t].lvolmul=(maxvol*lvol)/64; vinf[t].rvolmul=(maxvol*rvol)/64; } else{ vinf[t].lvolmul=(maxvol*vol)/64; } } } } part=min(TICKLEFT,todo); VC_WritePortion(buf,part); TICKLEFT-=part; todo-=part; buf+=samples2bytes(part); } }
static void NDS_HW_Update() { /* TODO should be called md_bpm/2.5 times per second? */ md_player(); int i; DC_FlushRange(ipc, sizeof(*ipc)); for(i = 0; i < NDS_HW_MAXVOICES; i++) { NDS_HW_VOICE* v = ipc->voices + i; if(v->changes != 0) { MikMod9_SendCommand( (NDS_HW_CMD_VOICE_UPDATE << 28) | (v->changes << 8) | i); v->changes = 0; } } }