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 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); }
// ===================================================================================== BOOL CSoundFile::TestMID(const BYTE *lpStream, DWORD dwMemLength) // ===================================================================================== { char id[5]; MIDHANDLE h; MMFILE mm; mm.mm = (char *)lpStream; mm.sz = dwMemLength; h.mmf = &mm; if (h.mmf->sz < 4) return FALSE; mmfseek(h.mmf,0,SEEK_SET); mmreadSBYTES(id, 4, h.mmf); id[4] = '\0'; return !strcmp(id,"MThd") && mid_read_long(&h) == 6; }
// ===================================================================================== BOOL CSoundFile::ReadMID(const BYTE *lpStream, DWORD dwMemLength) { static int avoid_reentry = 0; MIDHANDLE *h; MMFILE mm; int ch, dmulti, maxtempo, panlow, panhigh, numchans, numtracks; MIDTRACK *ttp; uint32_t t, numpats; char buf[256]; uint32_t miditracklen; BYTE runningstatus; BYTE cmd; BYTE midibyte[2]; long metalen, delta; BYTE *p; while( avoid_reentry ) sleep(1); avoid_reentry = 1; if( !TestMID(lpStream, dwMemLength) ) { avoid_reentry = 0; return FALSE; } h = MID_Init(); if( !h ) { avoid_reentry = 0; return FALSE; } h->mmf = &mm; mm.mm = (char *)lpStream; mm.sz = dwMemLength; mm.pos = 0; h->debug = getenv(ENV_MMMID_DEBUG); h->verbose = getenv(ENV_MMMID_VERBOSE); pat_resetsmp(); pat_init_patnames(); mmfseek(h->mmf,8,SEEK_SET); h->midiformat = mid_read_short(h); h->miditracks = mid_read_short(h); h->resolution = mid_read_short(h); // at this point the h->mmf is positioned at first miditrack if( h->midiformat == 0 ) h->miditracks = 1; if( h->resolution & 0x8000 ) h->divider = ((h->resolution & 0x7f00)>>8)*(h->resolution & 0xff); else