We've sent a verification link by email
Didn't receive the email? Check your Spam folder, it may have been caught by a filter. If you still don't see it, you can resend the verification email.
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 table
unsigned short waveTable[256];
// ---- sound data, stereo
short 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 table
prepareWaveTable( 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 sample
unsigned 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 note
if( sampleNumber >= noteNumber*kDELAY_NOTE ) {
// ---- up date phase before
arrayPhase[noteNumber] += arrayIncrement[noteNumber];
// ---- not let out of range [0; 255]
if( arrayPhase[noteNumber] > 0xff0000 ) // 0xff0000 == 255 << 16
arrayPhase[noteNumber] -= 0xff0000; // return to begin of wave table
}
unsigned short mauVat = waveTable[arrayPhase[noteNumber] >> 16];
// ---- add sound components
if( noteNumber < 2 ) // ---- first 2 notes left channel
channelLeft += mauVat;
else // ---- last 2 notes right channel
channelRight += mauVat;
// ---- next note
noteNumber++;
}
// ---- save left and right samples
soundData[sampleNumber << 1] = (channelLeft << 9) - 0x8000; // use << 1 for 16 bit
soundData[(sampleNumber << 1) + 1] = (channelRight << 9) - 0x8000; // use << 1 for 16 bit
upDateWaveTable( waveTable, sampleNumber & 0xff );
sampleNumber++;
}
// ---- save WAV file
saveSound( "Mac II.wav", soundData, sampleNumber << 1, kSAMPLE_RATE ); // multiply 2 because stereo
return 1;
}
void prepareWaveTable( unsigned short *waveTable, unsigned int value ) {
// ---- prepare wave table
unsigned short index = 0;
unsigned short waveTableValue = value & 0xff;
while( index < 64 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
waveTableValue = (value >> 8) & 0xff;
while( index < 128 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
waveTableValue = (value >> 16) & 0xff;
while( index < 192 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
waveTableValue = (value >> 24) & 0xff;
while( index < 256 ) {
waveTable[index] = waveTableValue; // << 8; // for 16 bit
index++;
}
}
void upDateWaveTable( unsigned short *waveTable, unsigned short index ) {
// ---- get value from wave table
unsigned short value = waveTable[index];
// ---- calculate new value for wave table
if( index == 255 ) { // careful at last element of wave table
value += waveTable[0];
value = (value >> 1);
waveTable[0] = value;
}
else {
value += waveTable[index+1];
value = (value >> 1);
waveTable[index+1] = value;
}
}
#pragma mark ---- SAVE WAV
void 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 file
FILE *file = fopen( fileName, "wb" );
if( file ) {
// ---- "RIFF"
fprintf( file, "RIFF" );
// ---- length sound file - 8
unsigned 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 length
fputc( (lengthSoundFile) & 0xff, file );
fputc( (lengthSoundFile >> 8) & 0xff, file );
fputc( (lengthSoundFile >> 16) & 0xff, file );
fputc( (lengthSoundFile >> 24) & 0xff, file );
// ---- "WAVE"
fprintf( file, "WAVE" );
// ---- save header
saveHeader( file, sampleRate );
// ---- save sound data
saveSoundDataInteger16bit( file, soundData, numberFrames );
// ---- close file
fclose( file );
}
else {
printf( "Problem save file %s\n", fileName );
}
}
void saveHeader( FILE *file, unsigned int sampleRate ) {
// ---- name for header "fmt "
fprintf( file, "fmt " );
// ---- header length
fputc( 0x10, file ); // length 16 byte
fputc( 0x00, file );
fputc( 0x00, file );
fputc( 0x00, file );
// ---- method for encode, 16 bit PCM
fputc( 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/second
unsigned int numberBytesSecond = sampleRate << 2; // multiply 4 because short (2 byte) * 2 channel
fputc( 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 sample
unsigned short bytesOneFrame = 4; // short (2 byte) * 2 channel
unsigned char bitsOneSample = 16; // short
fputc( 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 byte
fputc( 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++;
}
}
Type
Wave (.wav)
Duration
0:01.000
File size
173.9 KB
Sample rate
22257.0 Hz
Bit depth
16 bit
Channels
Stereo