Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
TuneGeneration2.0.c
/*-------------------------- |
Inclusions |
--------------------------*/ |
#include <QuickDraw.h> |
#include <Windows.h> |
#include <OSUtils.h> |
#include <FixMath.h> |
#include "BigEasy2.h" |
#include "BigEasyTextish.h" |
#include "BigEasyDialogs.h" |
#include "MusicHelper.h" |
#include "FlatInstrumentTest.h" |
typedef unsigned long uuuulong; /* hmmmm what is this, sheesh */ |
// ¥¥¥ typedef pascal void (*TunePlayCallBackProcPtr)(uuuulong *event,long seed,long refCon); |
#define kTuneSetNoteChannelsSelect kTuneLastSelector |
#define kTuneSetPartTransposeSelect kTuneLastSelector+1 |
#if 0 |
enum |
{ |
kTuneQuickStart = 8 /* Leave all the controllers where they are, ignore start time */ |
}; |
pascal ComponentResult TuneSetNoteChannels(TunePlayer tp, |
unsigned long count,NoteChannel *noteChannelList, |
TunePlayCallBackProcPtr playCallBackProc, |
long refCon) |
FIVEWORDINLINE(0x2F3C, 16, kTuneSetNoteChannelsSelect, 0x7000, 0xA82A); |
pascal ComponentResult TuneSetPartTranspose(TunePlayer tp, |
unsigned long part, |
long transpose, |
long velocityShift) |
FIVEWORDINLINE(0x2F3C, 12, kTuneSetPartTransposeSelect, 0x7000, 0xA82A); |
#endif |
/*-------------------------- |
Limits and Konstants |
--------------------------*/ |
enum |
{ |
mOpen = 100, |
mClose |
}; |
#define kTunePlayerCount 3 |
typedef struct |
{ |
WindowPtr w; |
NoteAllocator na; |
TunePlayer tp[kTunePlayerCount]; |
short tpStep; |
ToneDescription td; |
MusicScore ms; |
Handle headerH,tuneH; |
} Globals; |
Globals g; |
/*-------------------------- |
Prototypes |
--------------------------*/ |
static void DrawDoc(short n); |
static void ClickDoc(short n,Point p,short mods); |
static void KeyDoc(short n,short key,short code,short mods); |
static void IdleDoc(short n, Boolean front); |
static void GoAwayDoc(short n); |
static void ActivateDoc(short n); |
static void DeactivateDoc(short n); |
static void LetsQuit(short n,short menuItem,short menuRef); |
static void OpenWindow(short n,short menuItem,short menuRef); |
static void InitVars(void); |
static pascal Boolean MyFilterProc(DialogPtr theDialog, |
EventRecord *theEvent,short *itemHit); |
/*-------------------------- |
Computer Programs |
--------------------------*/ |
#define kHeaderHeight 17 |
void DrawDoc(short n) |
/* |
* Draws the window. |
*/ |
{ |
EraseRect(&gBigRect); |
MoveTo(10,20); |
DrawString("\pClick in window to play."); |
MoveTo(10,40); |
DrawString("\pOption-click to save movie."); |
} |
#define knccount 10 |
void ClickDoc(short n,Point p,short mods) |
/* |
* Come here for a click in the window. |
*/ |
{ |
ComponentResult result; |
NoteChannel nc[knccount]; |
Boolean ourNC; |
short i; |
TunePlayer tp; |
tp = g.tp[g.tpStep]; |
g.tpStep = (g.tpStep + 1 ) % kTunePlayerCount; |
if(!g.headerH) |
{ |
g.headerH = GetMusicScoreHeader(g.ms); |
HLock(g.headerH); |
} |
if(!g.tuneH) |
{ |
g.tuneH = GetMusicScoreScore(g.ms); |
HLock(g.tuneH); |
} |
#if 0 |
if(mods & shiftKey) |
{ |
NoteRequest nr; |
ourNC = true; |
result = NAStuffToneDescription(g.na,(p.h & 127) + 1,&nr.tone); |
nr.polyphony = 1; |
nr.typicalPolyphony = fixed1; |
result = NANewNoteChannel(g.na,&nr,&nc[0]); |
for(i = 1; i < knccount; i++) |
nc[i] = nc[0]; |
result = TuneSetNoteChannels(tp,knccount,nc,nil,0); |
} |
else if (!(mods & controlKey)) |
#endif |
{ |
result = TuneSetHeader(tp,*(unsigned long **)g.headerH); |
ourNC = false; |
} |
#if 0 |
for(i = 0; i < knccount; i++) |
result = TuneSetPartTranspose(tp,i,((p.v & 63) - 32)<<8,0); |
#endif |
TuneQueue(tp, |
*(unsigned long **)g.tuneH, |
fixed1, |
0, |
0x7FFFFFFF, |
kTuneStartNow, |
// kTuneStartNow + ((mods & controlKey) ? kTuneQuickStart : 0), |
nil, |
0); |
while(Button()); |
if(mods & (shiftKey | cmdKey)) |
{ |
TuneFlush(tp); |
TuneStop(tp,0); |
} |
if(ourNC) |
NADisposeNoteChannel(g.na,nc[0]); |
if(mods & optionKey) |
{ |
MusicMovie mm; |
StandardFileReply sfr; |
StandardPutFile("\pSave Music Movie:","\pTunetest",&sfr); |
if(sfr.sfGood) |
{ |
mm = StartMusicMovie(&sfr.sfFile,g.headerH); |
AddMusicMovieSample(mm,g.tuneH); |
FinishMusicMovie(&mm); |
} |
} |
} |
#define kOptionA (0xFF & (unsigned short)'') |
void KeyDoc(short n,short key,short code,short mods) |
{ |
MusicScore ms1,ms2; |
Handle header,tune1,tune2; |
if(key >= 'a' && key <= 'z') |
key += 'A' - 'a'; |
if(key == 'A' || key == 'B' || key == kOptionA) |
{ |
ms1 = NewMusicScore(); |
AddMusicScoreGMInstrument(ms1,1); /* piano */ |
ms2 = NewMusicScore(); |
AddMusicScoreGMInstrument(ms2,1); /* piano */ |
AddMusicScoreNote(ms1,1,60,100,600); |
AddMusicScoreRest(ms1,20); |
AddMusicScoreNote(ms2,1,80,70,600); |
AddMusicScoreRest(ms2,300); |
header = GetMusicScoreHeader(ms1); |
tune1 = GetMusicScoreScore(ms1); |
tune2 = GetMusicScoreScore(ms2); |
HLock(header); |
HLock(tune1); |
HLock(tune2); |
TuneSetHeader(g.tp[0],*(unsigned long **)header); |
TuneQueue(g.tp[0], |
*(unsigned long **)tune1, |
fixed1, |
0, |
0x7FFFFFFF, |
kTuneStartNewMaster, |
nil, |
0); |
TuneQueue(g.tp[0], |
*(unsigned long **)tune2, |
fixed1, |
0, |
0x7FFFFFFF, |
0 + (key == 'A' ? 0 : kTuneDontClipNotes), |
nil, |
0); |
if(key == kOptionA) |
{ |
MusicMovie mm; |
StandardFileReply sfr; |
StandardPutFile("\pSave Music Movie:","\pTunetest",&sfr); |
if(sfr.sfGood) |
{ |
mm = StartMusicMovie(&sfr.sfFile,header); |
AddMusicMovieSample(mm,tune1); |
AddMusicMovieSample(mm,tune2); |
FinishMusicMovie(&mm); |
} |
} |
} |
} |
void IdleDoc(short n, Boolean front) |
{ |
#pragma unused (n,front) |
} |
void GoAwayDoc(short n) |
/* |
* Close that window... |
*/ |
{ |
UninstallWindow(n); |
} |
void ActivateDoc(short n) |
{ |
#pragma unused (n) |
SetMenuItem(mClose,1,0,0,nil); /* enable "Close" menu item */ |
SetMenuItem(mOpen,-1,0,0,nil); /* disable "Open" menu item */ |
} |
void DeactivateDoc(short n) |
{ |
#pragma unused (n) |
SetMenuItem(mClose,-1,0,0,nil); /* disable "Close" menu item */ |
SetMenuItem(mOpen,1,0,0,nil); /* enable "Open" menu item */ |
} |
void LetsQuit(short n,short menuItem,short menuRef) |
{ |
#pragma unused (n,menuItem,menuRef) |
gQuitApp++; |
} |
#define kWindowWidth 220 |
#define kWindowHeight 140 |
void OpenWindow(short n,short menuItem,short menuRef) |
{ |
#pragma unused (n,menuItem,menuRef) |
Rect r; |
SetRect(&r,0,0,kWindowWidth,kWindowHeight); |
OffsetRect(&r,20,40); |
g.w = InstallWindow(1,"\p",&r,0,wCopyDraw, |
DrawDoc,ClickDoc,KeyDoc,nil, |
ActivateDoc,DeactivateDoc,IdleDoc); |
} |
Fixed FRandom(Fixed low,Fixed high); |
Fixed FRandom(Fixed low,Fixed high) |
{ |
unsigned long x,y; |
x = Random(); |
x &= 0xFFFF; |
y = Random(); |
y &= 0xFFFF; |
x <<= 16; |
x = x % (high - low + 1); |
x += low; |
return (Fixed) x; |
} |
void DoBeat1(void); |
void DoBeat1(void) |
{ |
long tu,d; |
tu = 100; |
d = 300; |
/* 1 */ |
AddMusicScoreNote(g.ms,1,0x3200,127,d*5); |
AddMusicScoreNote(g.ms,1,0x3244,100,d*5); |
AddMusicScoreNote(g.ms,2,60,120,d); |
AddMusicScoreNote(g.ms,2,90,120,d); |
AddMusicScoreRest(g.ms,tu*2); |
/* 2 */ |
AddMusicScoreNote(g.ms,2,63,120,d); |
AddMusicScoreNote(g.ms,3,93,90,d); |
AddMusicScoreNote(g.ms,3,88,90,d); |
AddMusicScoreRest(g.ms,tu*2); |
/* 3 */ |
AddMusicScoreNote(g.ms,2,60,120,d); |
AddMusicScoreNote(g.ms,2,92,120,d); |
AddMusicScoreRest(g.ms,tu*1); |
AddMusicScoreNote(g.ms,2,91,120,d); |
AddMusicScoreRest(g.ms,tu*2); |
/* (4) */ |
AddMusicScoreNote(g.ms,2,92,120,d); |
AddMusicScoreRest(g.ms,tu*1); |
/* 5 */ |
AddMusicScoreNote(g.ms,2,93,120,d); |
AddMusicScoreNote(g.ms,2,60,120,d); |
AddMusicScoreRest(g.ms,tu*2); |
/* 6 */ |
AddMusicScoreNote(g.ms,1,0x2200,80,d*5); |
AddMusicScoreNote(g.ms,1,0x2244,80,d*5); |
AddMusicScoreNote(g.ms,2,63,120,d); |
AddMusicScoreRest(g.ms,tu*2); |
/* 7 */ |
AddMusicScoreNote(g.ms,1,0x3900,80,d*5); |
AddMusicScoreNote(g.ms,1,0x3244,80,d*5); |
AddMusicScoreNote(g.ms,2,60,120,d); |
AddMusicScoreNote(g.ms,2,92,120,d); |
AddMusicScoreRest(g.ms,tu*1); |
AddMusicScoreNote(g.ms,3,92,120,d); |
AddMusicScoreNote(g.ms,3,87,86,d); |
AddMusicScoreNote(g.ms,2,91,80,d); |
AddMusicScoreRest(g.ms,tu*1); |
/* 8 */ |
AddMusicScoreNote(g.ms,2,91,120,d); |
AddMusicScoreRest(g.ms,tu*1); |
AddMusicScoreNote(g.ms,2,92,120,d); |
AddMusicScoreRest(g.ms,tu*1); |
} |
void InitVars() |
/* |
* Called once at startup: yes, it |
* inits the vars. |
*/ |
{ |
ComponentResult result; |
short i; |
Fixed p; |
FlatInstrument *flatInstrument,*flatInstrument2; |
flatInstrument2 = CreateFlatInstrument(); |
flatInstrument = CreateFlatInstrumentFromSnd(1010); |
g.na = OpenDefaultComponent('nota',0); |
g.tpStep = 0; |
for(i = 0; i < kTunePlayerCount; i++) |
g.tp[i] = OpenDefaultComponent('tune',0); |
g.ms = NewMusicScore(); |
AddMusicScoreGMInstrument(g.ms,1); /* piano */ |
// AddMusicScoreGMInstrument(g.ms,53); |
// AddMusicScoreGMInstrument(g.ms,12); /* vibraphone */ |
AddMusicScoreFlatInstrument(g.ms,flatInstrument2); /* ringmods */ |
AddMusicScoreFlatInstrument(g.ms,flatInstrument); /* boomp */ |
#if 1 |
DoBeat1(); |
#else |
#define kTimeUnit 400 |
for(i = 0; i < 12; i++) |
{ |
AddMusicScoreNote(g.ms,1,60+i,100,kTimeUnit*3/4); |
AddMusicScoreNote(g.ms,2,60+i,80,kTimeUnit); |
p = i+60; |
p<<=16; |
AddMusicScoreNote(g.ms,2,i+55, |
80,kTimeUnit/2); |
AddMusicScoreRest(g.ms,kTimeUnit/2); |
AddMusicScoreNote(g.ms,2,i+55, |
90,kTimeUnit/4); |
AddMusicScoreRest(g.ms,kTimeUnit/4); |
AddMusicScoreNote(g.ms,2,i+55, |
80,kTimeUnit/4); |
AddMusicScoreRest(g.ms,kTimeUnit/4); |
} |
AddMusicScoreNote(g.ms,1,48,100,kTimeUnit*9); |
AddMusicScoreNote(g.ms,2,52,60,kTimeUnit*9); |
AddMusicScoreNote(g.ms,2,55,60,kTimeUnit*9); |
AddMusicScoreNote(g.ms,2,(55L<<8) | 0x10,60,kTimeUnit*9); |
AddMusicScoreNote(g.ms,1,72,60,kTimeUnit*9); |
AddMusicScoreRest(g.ms,10); |
AddMusicScoreNote(g.ms,1,79,100,kTimeUnit*9); |
AddMusicScoreRest(g.ms,10); |
AddMusicScoreNote(g.ms,1,84,90,kTimeUnit*9); |
AddMusicScoreRest(g.ms,kTimeUnit*14); |
#endif |
} |
void AddMusicScoreNote(MusicScore ms, |
short part,Fixed pitch,long velocity,TimeValue noteDuration); |
void AddMusicScoreRest(MusicScore ms,TimeValue restDuration); |
void Bootstrap() |
{ |
InitVars(); |
/*** File Menu ***/ |
InstallMenu("\pFile",nil,0); |
InstallMenuItem("\pQuit/Q",LetsQuit,0); |
/*** Edit Menu ***/ |
InstallEditMenu(nil,nil,nil,nil,nil); |
/*** Picker Menu ***/ |
InstallMenu("\pTune",nil,0); |
OpenWindow(0,0,0); |
} |
void Hatstrap() |
/* |
* clean up |
*/ |
{ |
short i; |
for(i = 0; i < kTunePlayerCount; i++) |
CloseComponent(g.tp[i]); |
} |
pascal Boolean MyFilterProc(DialogPtr theDialog, |
EventRecord *theEvent,short *itemHit) |
{ |
GrafPort *oldPort; |
GetPort(&oldPort); |
SetPort(theDialog); |
if(theEvent->what == updateEvt && (DialogPtr)theEvent->message != theDialog) |
HandleUpdateEvent(theEvent); |
SetPort(oldPort); |
return false; |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14