static void pat_get_layerheader(MMFILE *mmpat, LayerHeader *hl) { InstrumentHeader ih; mmfseek(mmpat,sizeof(PatchHeader), SEEK_SET); mmreadUBYTES((BYTE *)&ih, sizeof(InstrumentHeader), mmpat); mmreadUBYTES((BYTE *)hl, sizeof(LayerHeader), mmpat); strncpy(hl->reserved, ih.instrument_name, 40); }
static void pat_read_patname(PATHANDLE *h, MMFILE *mmpat) { InstrumentHeader ih; mmfseek(mmpat,sizeof(PatchHeader), SEEK_SET); mmreadUBYTES((BYTE *)&ih, sizeof(InstrumentHeader), mmpat); strncpy(h->patname, ih.instrument_name, 16); h->patname[15] = '\0'; }
static void pat_get_waveheader(MMFILE *mmpat, WaveHeader *hw, int layer) { long int pos, bestpos=0; LayerHeader hl; ULONG bestfreq, freqdist; int i; // read the very first and maybe only sample pat_get_layerheader(mmpat, &hl); if( hl.samples > 1 ) { if( layer ) { if( layer > hl.samples ) layer = hl.samples; // you don't fool me.... for( i=1; i<layer; i++ ) { mmreadUBYTES((BYTE *)hw, sizeof(WaveHeader), mmpat); mmfseek(mmpat, hw->wave_size, SEEK_CUR); if ( mmpat->error ) { hw->wave_size = 0; return; } } } else { bestfreq = C4mHz * 1000; // big enough for( i=0; i<hl.samples; i++ ) { pos = mmftell(mmpat); mmreadUBYTES((BYTE *)hw, sizeof(WaveHeader), mmpat); if( hw->root_frequency > C4mHz ) freqdist = hw->root_frequency - C4mHz; else freqdist = 2 * (C4mHz - hw->root_frequency); if( freqdist < bestfreq ) { bestfreq = freqdist; bestpos = pos; } mmfseek(mmpat, hw->wave_size, SEEK_CUR); } mmfseek(mmpat, bestpos, SEEK_SET); } } mmreadUBYTES((BYTE *)hw, sizeof(WaveHeader), mmpat); if( hw->start_loop >= hw->wave_size ) { hw->start_loop = 0; hw->end_loop = 0; hw->modes &= ~PAT_LOOP; // mask off loop indicator } if( hw->end_loop > hw->wave_size ) hw->end_loop = hw->wave_size; }
static short int mid_read_short(MIDHANDLE *h) { BYTE buf[2]; mmreadUBYTES(buf, 2, h->mmf); return (buf[0]<<8)|buf[1]; }
static uint32_t mid_read_long(MIDHANDLE *h) { BYTE buf[4]; mmreadUBYTES(buf, 4, h->mmf); return (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3]; }