This program is an attempt at producing music with not only pitches but non-arbitrary note durations. Its operation is the same as music.c, except for the addition of a note duration handler. The durations come from any of the system's variables, and are quantized down to four binarily weighted levels corresponding to eighth, quarter, half and whole note durations.
/* * Lorenz attractor chaotic music generator * $Id$ * Mike Andrews * */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define DATASIZE 100 /* Number of data points in output */ #define TIMESTEP 0.0001 /* Numerical timestep for dt */ #define XSCALE 0.65 /* Appropriate scaling factors for */ #define YSCALE 0.65 /* each axis. */ #define ZSCALE 0.65 #define TSCALE 20 /* Scaling factor for the time axis */ #define QUANTIZE 3 /* Quantization interval for the time axis */ void main() { double x1, y1, z1, x, y, z, t, dt, dx, dy, dz, initial; int xdat[DATASIZE], ydat[DATASIZE], zdat[DATASIZE]; int dxdat[DATASIZE], dydat[DATASIZE], dzdat[DATASIZE]; int qindex=0, hindex=0, eindex=0, windex=0; int duration[DATASIZE], melody[DATASIZE], i=0; int tp=0, tpo=-1, stuff[4]; long int tmp=0; FILE *song; song=fopen("output", "w"); printf("\nEnter initial conditions (x1=y1=z1=t= ?):"); scanf("%lf", &initial); x1=(y1=(z1=(t=initial))); /* Set initial conditions */ melody[i]=(duration[i]=0); dt=TIMESTEP; while(tp<((DATASIZE*QUANTIZE)-1)) { x=x1 + ( -10.0*x1 + 10.0*y1 ) * dt; y=y1 + ( 28.0*x1 - y1 - x1*z1 ) * dt; z=z1 + ( -(8/3)*z1 + x1*y1 ) * dt; t=t + dt; dx= -10.0*x + 10.0*y; dy= 28.0*x - y - x*z; dz= -(8/3)*z + x*y; tp=(int)floor(TSCALE*t); x1=x; y1=y; z1=z; if ((!(tp%QUANTIZE))&&(tp!=tpo)) { tpo=tp; xdat[i]=(int)floor(XSCALE*x); ydat[i]=(int)floor(YSCALE*y); zdat[i]=(int)floor(ZSCALE*z); dxdat[i]= (int)floor(dx); dydat[i]= (int)floor(dy); dzdat[i]= (int)floor(dz); i++; } } for (i=0; i<DATASIZE; i++) { melody[i]=xdat[i]; duration[i]=1; } eindex=0; qindex=1; hindex=2; windex=3; for (i=0; i<4; i++) stuff[i]=0; /* Stylistically, set probabilities in this order: eighth, quarter, half, whole */ for (i=0; i<DATASIZE; i++) stuff[duration[i]]++; tmp=0; for (i=0; i<4; i++) if (stuff[i]>stuff[tmp]) tmp=i; eindex=tmp; stuff[tmp]=-1; tmp=0; for (i=0; i<4; i++) if (stuff[i]>stuff[tmp]) tmp=i; qindex=tmp; stuff[tmp]=-1; tmp=0; for (i=0; i<4; i++) if (stuff[i]>stuff[tmp]) tmp=i; hindex=tmp; stuff[tmp]=-1; tmp=0; for (i=0; i<4; i++) if (stuff[i]>stuff[tmp]) tmp=i; windex=tmp; tmp=0; for (i=0; i<DATASIZE; i++) { if (duration[i]==eindex) duration[i]=1; else if (duration[i]==qindex) duration[i]=2; else if (duration[i]==hindex) duration[i]=4; else if (duration[i]==windex) duration[i]=8; fprintf(song, "%d %d\n", tmp, melody[i]); tmp+=duration[i]; } fclose(song); }