mmt@dciem.UUCP (Martin Taylor) (12/17/84)
For fun, I transliterated Andrew Shebanow's MacPascal 4-voice synthesizer program into C for SUMacC. It provides an example of how to specify waveshapes and to run the 4-voice sound. ==================Cut Here================ /*********************************************************************/ /* Plays a simple tune using the four voice capabilities of the Mac */ /* Written By: Andrew G. Shebanow 10/25/84 */ /* Tune "converted" by John Hewitt & Andrew Shebanow shebanow@ucbernie */ /* Transliterated into SUMacC C by Martin Taylor: */ /* utcsrgv!dciem!mmt@uw-beaver.arpa */ /*********************************************************************/ #include "mac/quickdraw.h" #include "mac/osintf.h" long Note32nd = 3; /* multiply factors for the duration of... */ long Rest32nd = 1; /* the note and the rest */ /* constants for note values from "Inside Macintosh" */ long NoNote = 0; /* for unused voices */ long Down1E = 124376; long Down1Gb = 141525; long Down1Ab = 159201; long Down1A = 165834; long Down1B = 186564; long MidD = 223877; long MidE = 248752; long MidAb = 318403; long MidA = 331669; long MidBb = 348253; long MidB = 373128; long Up1Db = 424537; long Up1D = 447754; long Up1E = 497504; long Up1Gb = 566100; long Up1Ab = 636806; long Up1A = 663339; long Up1B = 746257; long Up2Db = 849074; Wave wave1, wave2; /* the sound wave */ SoundStruct sndRec; /* the four voice sound record */ /* InitWaves initializes the sound wave shape */ InitWaves() { int j; for (j=0; j<=31; j++) { wave1.s[j] = 0; wave2.s[j] = 0; } for (j=32; j<=63; j++) { wave1.s[j] = 60; wave2.s[j] = 10; } for (j=64; j<=191; j++) { wave1.s[j] = 250; wave2.s[j] = 70; } for (j=192; j<=224; j++) { wave1.s[j] = 60; wave2.s[j] = 10; } for (j=225; j<=255; j++) { wave1.s[j] = 0; wave2.s[j] = 0; } } /* InitSounds initializes the sound structures */ InitSounds() { /* InitSounds */ InitWaves(); sndRec.snd1Wave = &wave1; sndRec.snd2Wave = &wave2; sndRec.snd3Wave = &wave2; sndRec.snd4Wave = &wave2; sndRec.snd1Phase = 0; sndRec.snd2Phase = 0; sndRec.snd3Phase = 0; sndRec.snd4Phase = 0; } /* Rest is a delay loop which does the proper delay for a note*/ Rest(n) int n; { long ticks; ticks = TickCount() + (Rest32nd * n); while (ticks >= TickCount()) ; } /* Play is the workhorse of the program. It plays a single 4 voice */ /* chord of the given duration using the four notes specified */ Play (note1, note2, note3, note4, n32nds) long note1, note2, note3, note4; int n32nds; { int length; length = n32nds * Note32nd; sndRec.duration = length; sndRec.snd1Rate = note1; sndRec.snd2Rate = note2; sndRec.snd3Rate = note3; sndRec.snd4Rate = note4; StartSound((Ptr)&sndRec); Rest(1); } /* Note that this tune is in 3/4 time. */ Part1() { Play(NoNote, MidE, NoNote, NoNote, 8); /* Measure 0 */ Play(Down1E, MidAb, Up1Db, NoNote, 6); /* Measure 1 */ Play(NoNote, Up1D, NoNote, NoNote, 2); Play(NoNote, MidD, MidAb, MidB, 8); Play(Down1B, MidD, MidAb, MidB, 8); Play(Down1E, MidD, MidAb, MidB, 16); /* Measure 2 */ Play(NoNote, Up1D, Up1Gb, NoNote, 8); Play(NoNote, MidB, Up1D, NoNote, 4); /* Measure 3 */ Play(NoNote, Up1Db, Up1E, NoNote, 4); Play(Down1A, Up1Db, Up1E, Up1A, 8); Play(Down1E, Up1Db, Up1E, Up1A, 8); Play(Down1A, Up1Db, Up1E, Up1A, 16); /* Measure 4 */ Play(NoNote, Up1Db, NoNote, NoNote, 8); Play(Down1E, MidBb, NoNote, NoNote, 6); /* Measure 5 */ Play(NoNote, MidB, NoNote, NoNote, 2); Play(Down1B, Up1D, NoNote, NoNote, 8); Play(Down1B, Up1D, NoNote, NoNote, 8); } Part2() { Play(Down1Ab, Up1D, NoNote, NoNote, 8); /* Measure 6 */ Play(Down1E, Up1D, NoNote, NoNote, 8); Play(Down1B, MidAb, NoNote, NoNote, 8); Play(Down1E, MidAb, NoNote, NoNote, 6); /* Measure 7 */ Play(NoNote, MidA, NoNote, NoNote, 2); Play(Down1A, MidA, Up1Db, NoNote, 8); Play(Down1E, MidA, Up1Db, NoNote, 8); Play(Down1A, MidA, Up1Db, NoNote, 16); /* Measure 8 */ Play(NoNote, MidE, NoNote, NoNote, 8); Play(Down1E, MidAb, Up1Db, NoNote, 6); /* Measure 9 */ Play(NoNote, Up1D, NoNote, NoNote, 2); Play(NoNote, MidD, MidAb, MidB, 8); Play(Down1B, MidD, MidAb, MidB, 8); Play(Down1E, MidD, MidAb, MidB, 16); /* Measure 10 */ Play(NoNote, Up1D, Up1Gb, NoNote, 8); Play(NoNote, MidB, Up1D, NoNote, 6); /* Measure 11 */ Play(NoNote, Up1Db, Up1E, NoNote, 2); Play(Down1A, Up1E, Up1A, Up2Db, 8); Play(Down1E, Up1E, Up1A, Up2Db, 8); } Part3() { Play(NoNote, Up1E, Up1A, Up2Db, 8); /* Measure 12 */ Play(Down1Gb, NoNote, NoNote, NoNote, 8); Play(NoNote, MidE, MidA, Up1Db, 8); Play(Down1Gb, MidA, Up1Db, NoNote, 6); /*Measure 13 */ Play(NoNote, MidB, Up1D, NoNote, 2); Play(Down1B, MidB, Up1D, Up1Gb, 8); Play(Down1A, MidB, Up1D, Up1Gb, 8); Play(Down1Ab, MidB, Up1D, Up1Gb, 16); /* Measure 14 */ Play(Down1E, MidB, Up1D, Up1Ab, 8); Play(Down1E, Up1D, Up1E, Up1B, 6); /* Measure 15 */ Play(NoNote, Up1A, NoNote, NoNote, 2); Play(Down1A, Up1Db, Up1E, Up1A, 8); Play(Down1E, Up1Db, Up1E, Up1A, 8); Play(Down1A, Up1Db, Up1E, Up1A, 16); /* Measure 16 */ Rest(8); } main() { /* Sound */ InitSounds(); Part1(); Part2(); Part3(); } ========================================== -- Martin Taylor {allegra,linus,ihnp4,floyd,ubc-vision}!utzoo!dciem!mmt {uw-beaver,qucis,watmath}!utcsrgv!dciem!mmt