From e69d0c16349dc2cddd1d231c1ea427849bc7cd39 Mon Sep 17 00:00:00 2001 From: angel Date: Thu, 9 Oct 2003 18:22:35 +0000 Subject: [PATCH] Support for GUS patches started. git-svn-id: file:///home/angel/tmp/svn-triptico/ahxm/trunk@21 c87de0a0-a11c-0410-a1e5-866214bc28b2 --- input.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- input.h | 2 + wav.c | 6 ++- 3 files changed, 186 insertions(+), 2 deletions(-) diff --git a/input.c b/input.c index 3efe6f5..81e7195 100644 --- a/input.c +++ b/input.c @@ -109,10 +109,12 @@ void load_pcm_wave(FILE * f, int * size, int bits, int channels, /* resample if needed */ if(frequency != _frequency) { + n=*size; + ls=wave_resample(ls, frequency, size); if(channels==2) - rs=wave_resample(rs, frequency, size); + rs=wave_resample(rs, frequency, &n); else rs=ls; } @@ -211,3 +213,179 @@ int load_wav_file(char * filename, int * size, int ** lwave, int ** rwave) } +/* table of frequencies for each note */ + +static int _pat_freq_table[128]= +{ + 8176, 8662, 9177, 9723, + 10301, 10913, 11562, 12250, + 12978, 13750, 14568, 15434, + + 16352, 17324, 18354, 19445, + 20602, 21827, 23125, 24500, + 25957, 27500, 29135, 30868, + + 32703, 34648, 36708, 38891, + 41203, 43654, 46249, 48999, + 51913, 55000, 58270, 61735, + + 65406, 69296, 73416, 77782, + 82407, 87307, 92499, 97999, + 103826, 110000, 116541, 123471, + + 130813, 138591, 146832, 155563, + 164814, 174614, 184997, 195998, + 207652, 220000, 233082, 246942, + + 261626, 277183, 293665, 311127, + 329628, 349228, 369994, 391995, + 415305, 440000, 466164, 493883, + + 523251, 554365, 587330, 622254, + 659255, 698456, 739989, 783991, + 830609, 880000, 932328, 987767, + + 1046502, 1108731, 1174659, 1244508, + 1318510, 1396913, 1479978, 1567982, + 1661219, 1760000, 1864655, 1975533, + + 2093005, 2217461, 2349318, 2489016, + 2637020, 2793826, 2959955, 3135963, + 3322438, 3520000, 3729310, 3951066, + + 4186009, 4434922, 4698636, 4978032, + 5274041, 5587652, 5919911, 6271927, + 6644875, 7040000, 7458620, 7902133, + + 8372018, 8869844, 9397273, 9956063, + 10548082, 11175303, 11839822, 12543854 +}; + + +static int _pat_find_note(int frequency) +{ + int n; + + for(n=0;n < 128;n++) + { + if(_pat_freq_table[n] >= frequency) + return(n); + } + + return(-1); +} + + +int load_pat_file(char * filename) +{ + FILE * f; + char buffer[512]; + int i, n; + int n_layers; + int size, loop_start, loop_end; + int base_note, min_note, max_note; + int frequency, flags, bits, ssigned, loop; + int * lwave; + int * rwave; + + if((f=fopen(filename,"r"))==NULL) + return(0); + + /* read signatures */ + fread(buffer, 12, 1, f); + if(strcmp(buffer, "GF1PATCH110")!=0) + { + fclose(f); + return(0); + } + + fread(buffer, 10, 1, f); + if(strcmp(buffer, "ID#000002")!=0) + { + fclose(f); + return(0); + } + + /* skip description */ + fread(buffer, 65, 1, f); + + /* volume */ + i=fget16(f); + printf("vol: %d\n", i); + + /* skip */ + fread(buffer, 109, 1, f); + + /* # of layers */ + n_layers=fgetc(f); + printf("layers: %d\n", n_layers); + + /* skip */ + fread(buffer, 40, 1, f); + + for(n=0;n < n_layers;n++) + { + /* layer name */ + fread(buffer, 8, 1, f); + printf("name: '%s'\n", buffer); + + size=fget32(f); + loop_start=fget32(f); + loop_end=fget32(f); + frequency=fget16(f); + + printf("size: %d [%d-%d], freq: %d\n", + size, loop_start, loop_end, frequency); + + min_note=fget32(f); + max_note=fget32(f); + base_note=fget32(f); + + printf("freqs: %d - %d - %d\n", + min_note, base_note, max_note); + printf("notes: %d - %d - %d\n", + _pat_find_note(min_note), + _pat_find_note(base_note), + _pat_find_note(max_note)); + + /* ignore fine-tune */ + fget16(f); + + /* pan position */ + i=fgetc(f); + printf("pan: %d\n", i); + + /* skip envelope rate, value, tremolo and vibrato */ + fread(buffer, 18, 1, f); + + flags=fgetc(f); + printf("flags: 0x%02X\n", flags); + + bits=flags & 0x01 ? 16 : 8; + ssigned=flags & 0x02 ? 1 : 0; + loop=flags & 0x04 ? 1 : 0; + + printf("bits: %d, sign: %d, loop: %d\n", + bits, ssigned, loop); + + if(bits == 16) + { + size /= 2; + loop_start /= 2; + loop_end /= 2; + } + + /* skip frequency scale data */ + fget16(f); fget16(f); + + /* skip reserved */ + fread(buffer, 36, 1, f); + + /* load the wave */ + load_pcm_wave(f, &size, bits, 1, + 44100, &lwave, &rwave); + } + + fclose(f); + return(1); +} diff --git a/input.h b/input.h index 7d37a23..1e31900 100644 --- a/input.h +++ b/input.h @@ -32,3 +32,5 @@ void load_pcm_wave(FILE * f, int * size, int bits, int channels, int * wave_resample(int * wave, int freq, int * size); int load_wav_file(char * filename, int * size, int ** lwave, int ** rwave); + +int load_pat_file(char * filename); diff --git a/wav.c b/wav.c index a51ce63..69b9e26 100644 --- a/wav.c +++ b/wav.c @@ -138,6 +138,10 @@ int main(void) memset(_generators, '\0', sizeof(_generators)); build_note_frequencies(); + load_pat_file("samples/acpiano.pat"); + return(0); + +/* load_wav_file("samples/amen1.wav", &size, &ls, &rs); generator_play(&_generators[0], ls, rs, size, 1, 0, size, 0.2, 1, 4410); @@ -159,7 +163,7 @@ int main(void) load_wav_file("samples/as-al017.wav", &size, &ls, &rs); generator_play(&_generators[5], ls, rs, size, 1, 0, size, 2, 2, 0); - +*/ /* f=popen("sox -V -t raw -s -r 44100 -c 2 -w - qq.wav","w"); */ -- 2.11.4.GIT