Start sound of mac ii iix iicx iici se/30. Create by dissessemble rom code and use wave table algorithm write c program write wav file. C program below:. /* mac_ii. C *//* boot beep mac ii *//* 2558/09/06 */. #include. #define knumber_samples 30000#define kdelay_note 300#define kwave_table_value 0x30013f10#define ksample_rate 22257 // hz. Void preparewavetable( unsigned short *wavetable, unsigned int value );void updatewavetable( unsigned short *wavetable, unsigned short chiso );void savesound( char *filename, short *sounddata, unsigned int numberframes, unsigned int samplerate );. Int main () {. // ---- wave tableunsigned short wavetable[256];// ---- sound data, stereoshort sounddata[knumber_samples << 1];// ---- increment array (16/16 bit fix point integer)int arrayincrement[] = {3 << 16, 4 << 16, (3 << 16) + 0x2f2, 6 << 16};// ---- prepare wave tablepreparewavetable( wavetable, kwave_table_value );. // ---- array phase (16/16 bit fix point integer)unsigned int arrayphase[] = {0, 0, 0, 0}; // set all = 0. Unsigned int samplenumber = 0;while( samplenumber < knumber_samples ) {. // ---- calculate sampleunsigned int channelleft = 0;unsigned int channelright = 0;unsigned char notenumber = 0;while ( notenumber < 4 ) {// ---- see if should update phase for note, only do if play noteif( samplenumber >= notenumber*kdelay_note ) {// ---- up date phase beforearrayphase[notenumber] += arrayincrement[notenumber];// ---- not let out of range [0; 255]if( arrayphase[notenumber] > 0xff0000 ) // 0xff0000 == 255 << 16arrayphase[notenumber] -= 0xff0000; // return to begin of wave table}unsigned short mauvat = wavetable[arrayphase[notenumber] >> 16];. // ---- add sound componentsif( notenumber < 2 ) // ---- first 2 notes left channelchannelleft += mauvat;else // ---- last 2 notes right channelchannelright += mauvat;// ---- next notenotenumber++;}// ---- save left and right samplessounddata[samplenumber << 1] = (channelleft << 9) - 0x8000; // use << 1 for 16 bitsounddata[(samplenumber << 1) + 1] = (channelright << 9) - 0x8000; // use << 1 for 16 bitupdatewavetable( wavetable, samplenumber & 0xff );samplenumber++;}// ---- save wav filesavesound( "mac ii. Wav", sounddata, samplenumber << 1, ksample_rate ); // multiply 2 because stereo. Return 1;}. Void preparewavetable( unsigned short *wavetable, unsigned int value ) {. // ---- prepare wave tableunsigned short index = 0;unsigned short wavetablevalue = value & 0xff;while( index < 64 ) {wavetable[index] = wavetablevalue; // << 8; // for 16 bitindex++;}. Wavetablevalue = (value >> 8) & 0xff;while( index < 128 ) {wavetable[index] = wavetablevalue; // << 8; // for 16 bitindex++;}. Wavetablevalue = (value >> 16) & 0xff;while( index < 192 ) {wavetable[index] = wavetablevalue; // << 8; // for 16 bitindex++;}wavetablevalue = (value >> 24) & 0xff;while( index < 256 ) {wavetable[index] = wavetablevalue; // << 8; // for 16 bitindex++;}}. Void updatewavetable( unsigned short *wavetable, unsigned short index ) {// ---- get value from wave tableunsigned short value = wavetable[index];// ---- calculate new value for wave tableif( index == 255 ) { // careful at last element of wave tablevalue += wavetable[0];value = (value >> 1);wavetable[0] = value;}else {value += wavetable[index+1];value = (value >> 1);wavetable[index+1] = value;}. }. #pragma mark ---- save wavvoid saveheader( file *filename, unsigned int samplerate );void savesounddatainteger16bit( file *filename, short *sounddata, unsigned int numbersamples );. Void savesound( char *filename, short *sounddata, unsigned int numberframes, unsigned int samplerate ) {// ---- open filefile *file = fopen( filename, "wb" );if( file ) {// ---- "riff"fprintf( file, "riff" );// ---- length sound file - 8unsigned int lengthsoundfile = 32;lengthsoundfile += numberframes << 1; // một không có một mẫu vạt cho kênh trái và phải// ---- save file lengthfputc( (lengthsoundfile) & 0xff, file );fputc( (lengthsoundfile >> 8) & 0xff, file );fputc( (lengthsoundfile >> 16) & 0xff, file );fputc( (lengthsoundfile >> 24) & 0xff, file );// ---- "wave"fprintf( file, "wave" );// ---- save headersaveheader( file, samplerate );// ---- save sound datasavesounddatainteger16bit( file, sounddata, numberframes );// ---- close filefclose( file );}else {printf( "problem save file %s\n", filename );}}. Void saveheader( file *file, unsigned int samplerate ) {// ---- name for header "fmt "fprintf( file, "fmt " );// ---- header lengthfputc( 0x10, file ); // length 16 bytefputc( 0x00, file );fputc( 0x00, file );fputc( 0x00, file );// ---- method for encode, 16 bit pcmfputc( 0x01 & 0xff, file );fputc( (0x00 >> 8) & 0xff, file );// ---- number channels (stereo)fputc( 0x02, file );fputc( 0x00, file );// ---- sample rate (hz)fputc( samplerate & 0xff, file );fputc( (samplerate >> 8) & 0xff, file );fputc( (samplerate >> 16) & 0xff, file );fputc( (samplerate >> 24) & 0xff, file );// ---- number bytes/secondunsigned int numberbytessecond = samplerate << 2; // multiply 4 because short (2 byte) * 2 channelfputc( numberbytessecond & 0xff, file );fputc( (numberbytessecond >> 8) & 0xff, file );fputc( (numberbytessecond >> 16) & 0xff, file );fputc( (numberbytessecond >> 24) & 0xff, file );// ---- byte cho một khung (nên = số lượng mẫu vật * số lượng kênh)// ---- number bytes for sampleunsigned short bytesoneframe = 4; // short (2 byte) * 2 channelunsigned char bitsonesample = 16; // shortfputc( bytesoneframe & 0xff, file );fputc( (bytesoneframe >> 8) & 0xff, file );. Fputc( bitsonesample, file );fputc( 0x00, file );}. Void savesounddatainteger16bit( file *file, short *sounddata, unsigned int numbersamples ) {fprintf( file, "data" );unsigned int datalength = numbersamples << 1; // each sample 2 bytefputc( datalength & 0xff, file );fputc( (datalength >> 8) & 0xff, file );fputc( (datalength >> 16) & 0xff, file );fputc( (datalength >> 24) & 0xff, file );unsigned int sampleindex = 0;while( sampleindex < numbersamples ) {short shortdata = sounddata[sampleindex];fputc( shortdata & 0xff, file );fputc( (shortdata >> 8) & 0xff, file );sampleindex++;}}.
Author: Sieuamthanh