~rabbits/orca-toy

bae038a27f566c9ed399cda07e0425b87220f4de — neauoire 2 years ago 5638311
Playing notes again
4 files changed, 36 insertions(+), 49 deletions(-)

M demo.orca
M orca.c
M sim.c
M sim.h
M demo.orca => demo.orca +2 -2
@@ 12,6 12,6 @@
................................
...V....X....Y...1ZC............
................................
....D........D.......D..........
.....:0.......:12.....:23E......
.....................D..........
......................:23E......
................................
\ No newline at end of file

M orca.c => orca.c +26 -40
@@ 31,7 31,7 @@ typedef struct {
} Rect2d;

typedef struct {
	int channel, octave, note, gate;
	int channel, value, velocity, length;
} Note;

char OCTAVE[] = {'C', 'c', 'D', 'd', 'E', 'F', 'f', 'G', 'g', 'A', 'a', 'B'};


@@ 343,44 343,26 @@ nteval(int o, char c)
}

Note *
setnote(Note *n, int channel, int octave, int note, int gate)
sendmidi(int chn, int val, int vel, int len)
{
	n->channel = channel;
	n->octave = octave;
	n->note = note;
	n->gate = gate;
	return n;
}

Note *
pushmidi(int chn, int val, int vel, int len)
{
	printf("%d %d %d %d\n", chn, val, vel, len);
	/*
	int i = 0;
	for(i = 0; i < 16; ++i)
		if(!playing[i].gate)
			return setnote(&playing[i], channel, octave, note, gate);
	return NULL;
	*/
	for(i = 0; i < 16; ++i) {
		Note *n = &playing[i];
		if(n->length < 1) {
			n->channel = chn;
			n->value = val;
			n->velocity = vel;
			n->length = len;
			Pm_WriteShort(midi,
				Pt_Time(),
				Pm_Message(0x90 + chn, val, vel * 3));
			return n;
		}
	}
	return NULL;
}

void
playmidi(int channel, int octave, int note, int len)
{
	Pm_WriteShort(midi,
		Pt_Time(),
		Pm_Message(0x90 + channel, (octave * 12) + note, 100));
	Pm_WriteShort(midi,
		Pt_Time(),
		Pm_Message(0x90 + channel, (octave * 12) + note, 0));
	printf("%d -> %d\n", channel, (octave * 12) + note);
	pushmidi(channel, octave, note, len);
	fflush(stdout);
}

void
parsemidi(char *msg, int msglen)
{
	char chn, oct, nte, vel = 'z', len = '1';


@@ 393,7 375,7 @@ parsemidi(char *msg, int msglen)
		vel = msg[3];
	if(msglen > 4)
		len = msg[4];
	pushmidi(
	sendmidi(
		base36(chn),
		12 * base36(oct) + nteval(0, nte),
		base36(vel),


@@ 401,19 383,23 @@ parsemidi(char *msg, int msglen)
}

void
play(void)
runmsg(void)
{
	int i, j = 0;
	char buf[128];
	/* release */
	for(i = 0; i < 16; ++i) {
		if(playing[i].gate > 0) {
			playing[i].gate--;
			printf("release: #%d[%d]\n", i, playing[i].gate);
		Note *n = &playing[i];
		if(n->length > 0) {
			n->length--;
			if(n->length == 0)
				Pm_WriteShort(midi,
					Pt_Time(),
					Pm_Message(0x90 + n->channel, n->value, 0));
		}
	}
	/* split messages */
	for(i = 0; i < g.msg_len + 1; ++i)
	for(i = 0; i < g.msglen + 1; ++i)
		if(!g.msg[i] || cisp(g.msg[i])) {
			buf[j] = '\0';
			parsemidi(buf, j);


@@ 627,7 613,7 @@ main(int argc, char *argv[])

		if(!PAUSE && tickrun >= 8) {
			rungrid(&g);
			play();
			runmsg();
			redraw(pixels);
			tickrun = 0;
		}

M sim.c => sim.c +5 -5
@@ 502,12 502,12 @@ void
opspecial(Grid *g, int x, int y)
{
	int i, b = bang(g, x, y);
	for(i = 0; x + i < 256; ++i) {
	for(i = 0; x + i < MAXMSG; ++i) {
		char c = getport(g, x + i, y, 1);
		if(c == '.')
			break;
		if(b)
			g->msg[g->msg_len++] = c;
		if(b && g->msglen < MAXMSG)
			g->msg[g->msglen++] = c;
	}
	settype(g, x, y, b ? 3 : 2);
}


@@ 560,7 560,7 @@ rungrid(Grid *g)
		g->type[i] = 0;
	}
	g->msg[0] = '\0';
	g->msg_len = 0;
	g->msglen = 0;
	for(i = 0; i < g->l; ++i) {
		char c = g->data[i];
		x = i % g->w;


@@ 609,6 609,6 @@ initgrid(Grid *g, int w, int h)
		g->data[i] = '.';
	}
	g->msg[0] = '\0';
	g->msg_len = 0;
	g->msglen = 0;
	printf("Resize: %dx%d\n", g->w, g->h);
}

M sim.h => sim.h +3 -2
@@ 2,12 2,13 @@

#include <stdio.h>

#define MAXMSG 64
#define MAXSZ 128 * 128

typedef struct Grid {
	int w, h, l, f, r, msg_len;
	int w, h, l, f, r, msglen;
	int lock[MAXSZ], type[MAXSZ];
	char data[MAXSZ], vars[36], msg[16];
	char data[MAXSZ], vars[36], msg[MAXMSG];
} Grid;

int base36(char c);