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