This is MyObject.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "MyObject.h"
#import <musickit/musickit.h>
#import <appkit/appkit.h>
@implementation MyObject
- init
{
[super init];
numQuarterNotes = 20;
numEighthNotes = 20;
numSixteenthNotes = 20;
numPitchesEnabled = 5;
tempo = 60;
pitchMode[0] = 1; pitchMode[2] = 1; pitchMode[4] = 1; pitchMode[7] = 1;
pitchMode[9] = 1;
return self;
}
- setNumQuarterNotes:sender
{
numQuarterNotes = [sender intValue];
return self;
}
- setNumEighthNotes:sender
{
numEighthNotes = [sender intValue];
return self;
}
- setNumSixteenthNotes:sender
{
numSixteenthNotes = [sender intValue];
return self;
}
- setTempoFrom:sender
{
tempo = [sender doubleValue];
return self;
}
- setMode:sender
{
int whichCell = [sender selectedRow];
int isEnabled = [[sender selectedCell] intValue];
pitchMode[whichCell] = isEnabled;
if (isEnabled)
numPitchesEnabled++;
else numPitchesEnabled--;
return self;
}
static double ranNum()
/* Returns a random number between 0 and 1. */
{
# define RANDOMMAX (double)((long)MAXINT)
return ((double)random()) / RANDOMMAX;
}
- compute:sender
{
# define BASE_KEY_NUM 40
id aScore,aNote,aPart;
int i,j,k,l,keyNum;
double x,time,rhythm;
if (numPitchesEnabled == 0)
return self;
i=0;
j=0;
k=0;
time = 0;
aScore = [[Score alloc] init];
aPart = [[Part alloc] init];
[aPart addToScore:aScore];
aNote = [[Note alloc] init];
[aNote setPar:MK_tempo toDouble:tempo];
[aScore setInfo:aNote];
while(i<numEighthNotes || j<numSixteenthNotes || k<numQuarterNotes) {
x = ranNum();
if (x > .666) {
if (i++>=numEighthNotes)
continue;
rhythm = 0.5;
} else if (x > .333) {
if (j++>=numSixteenthNotes)
continue;
rhythm = 0.25;
} else {
if (k++>=numQuarterNotes)
continue;
rhythm = 1.0;
}
keyNum = -1;
do {
l = (int)(ranNum() * 11.999);
if (pitchMode[l])
keyNum = l + BASE_KEY_NUM;
} while (keyNum == -1);
aNote = [[Note alloc] init];
[aNote setDur:rhythm];
[aNote setTimeTag:time];
time += rhythm;
[aNote setPar:MK_keyNum toInt:keyNum];
[aPart addNote:aNote];
}
aNote = [[Note alloc] init];
[aNote setPar:MK_synthPatch toString:"Pluck"];
[aPart setInfo:aNote];
[aScore writeOptimizedScorefile:"/tmp/test.playscore"];
[aScore free];
return self;
}
- play:sender
{
system("playscore -f -q /tmp/test.playscore");
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.