Log in to Freesound

Problems logging in?
Don't have an account? Join now

Problems logging in?

Enter your email or username below and we'll send you a link to help you login into your account.

Back to log in

Almost there!

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.

Default title

  • Sounds
  • Tags
  • Forum
  • Map
    • Sounds
    • Packs
    • Forum
    • Map
    • Tags
    • Random sound
    • Charts
    • Donate
    • Help

Mac IIx.wav

Overall rating (5 ratings)
SieuAmThanh

July 4th, 2017

Follow
Instrument samples > Keyboard
MC680x0 Macintosh

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++;
}

}

Sound illegal or offensive? Flag it!
30
Mac
Mac-II
Mac-IIci
Mac-IIcx
Mac-IIx
macintosh
SE
start
start-up

Type

Wave (.wav)

Duration

0:01.000

File size

173.9 KB

Sample rate

22257.0 Hz

Bit depth

16 bit

Channels

Stereo

Comments
This sound has not been commented on yet, be the first to comment!
Please log in to comment
  1. 213 downloads
  2. 0 comments
Creative Commons 0
You can copy, modify, distribute and perform the sound, even for commercial purposes, all without the need of asking permission to the author. Get attribution text...
Login to download
Share url:
920 x 245
Embed example, large size
481 x 86
Embed example, medium size
375 x 30
Embed example, small size
About Freesound Terms of use Privacy Cookies Developers Help Donations Blog Freesound Labs Get your t-shirt!
© 2025 Universitat Pompeu Fabra