expo-processing/monophonic_synth.pde

145 lines
4.4 KiB
Plaintext
Executable File

/*
basic_drawing
You can draw by simply adding points directly or converted
cc teddavis.org 2017/18
*/
// import and create instance of XYscope
XYscope ms_xy;
int ms_n_point = 30;
float ms_t;
float ms_x[] = new float[2000];
float ms_y[] = new float[2000];
float ms_rx[] = new float[2000];
float ms_ry[] = new float[2000];
float []ms_channel = new float[128];
float []ms_channel_amp = new float[128];
int []ms_chan_index = new int [121];
int ms_period = 0;
int ms_activated_channels = 0;
int ms_rect_circle = 0;
Star[] ms_stars = new Star[500];
void midi_monophonic_synth(int status, int chan, int value)
{
boolean swapped = false;
if (status == -112)
{
//channel = (12f*(log((pow(2, (chan - 69f)/12))/440f)/log(2)) + 69f);
for (int i = 0; i < 121; i++)
{
if (ms_channel[i] < 1)
{
ms_channel[i] = pow(2, (chan - 69f) / 12) * 440;
ms_channel_amp[i] = map(value, 0, 127, 0, 1);
ms_chan_index[i] = chan;
break;
}
}
ms_activated_channels++;
}
if (status == -128)
{
for (int i = 0; i < 121; i++)
{
if(ms_chan_index[i] == chan && swapped == false)
{
ms_channel[i] = 0;
ms_channel_amp[i] = 0;
ms_chan_index[i] = 0;
swapped = true;
}
if (swapped == true)
{
ms_channel[i] = ms_channel[i + 1];
ms_channel_amp[i] = ms_channel_amp[i + 1];
ms_chan_index[i] = ms_chan_index[i+1];
if (ms_channel[i] < 1)
break;
}
}
ms_activated_channels--;
}
if (chan == 7 && status == -80)
ms_n_point = value * 2;
if (chan == 7 && status == -79)
ms_rect_circle = value;
}
void setup_monophonic_synth() {
for (int i = 0; i < 2000; i++)
{
ms_rx[i] = random(-2000, 1000) / 1000.0;
ms_ry[i] = random(-1000, 1000) / 1000.0;
}
for (int i = 0; i < 128; i++)
{
ms_channel[i] = 0;
ms_channel_amp[i] = 0;
}
background(0);
// initialize XYscope with default sound out
ms_xy = new XYscope(this);
//xy.getMixerInfo();
ms_setup_star();
}
void draw_monophonic_synth() {
strokeWeight(2);
background(0);
ms_xy.clearWaves();
ms_t = millis() / 1000.0;
ms_t = 1;
//loadPixels();
if (ms_activated_channels > 0)
{
ms_xy.freq(ms_channel[ms_period % ms_activated_channels]);
ms_xy.amp(ms_channel_amp[ms_period % ms_activated_channels]);
} else
ms_xy.freq(0);
for (int i = 0; i < ms_n_point; i++)
{
ms_x[i] = (-ms_rx[i] * ms_rx[i] + ms_rx[i] + ms_ry[i]) * (cos(ms_t) * 500) + width/2;
ms_y[i] = (ms_rx[i] * (ms_rx[i] - ms_ry[i]) * ms_ry[i] - ms_rx[i] * ms_ry[i] + ms_ry[i]) * (sin(ms_t) * 500) * (cos(ms_rx[i]) * ms_rx[i]) + ms_ry[i] + height/2;
}
for (int i = 0; i < ms_activated_channels; i++)
{
for (int j = 127; j > 127 - ms_n_point; j--)
{
ms_xy.ellipse(map(ms_chan_index[i], 0, 120, 0, width), height / 2, j, j);
ms_xy.ellipse(map(ms_chan_index[i], 0, 120, 0, width), map(ms_chan_index[i], 0, 120, 0, height), j, j);
if (ms_rect_circle > 84)
{
ms_xy.rect(map(ms_chan_index[i], 0, 120, 0, width), 0, j / 2, j / 2);
ms_xy.ellipse(map(ms_chan_index[i], 0, 120, 0, width), 0.66f * height, j / 2, j / 2);
}
else if (ms_rect_circle > 42)
ms_xy.rect(map(ms_chan_index[i], 0, 120, 0, width), height/ 2, j / 2, j / 2);
else
ms_xy.ellipse(map(ms_chan_index[i], 0, 120, 0, width), height /2, j / 2, j / 2);
}
}
//updatePixels();
// build audio from shapes
ms_xy.buildWaves();
// draw all analytics
ms_xy.drawAll();
ms_period++;
ms_manage_star();
}
void keyPressed() {
if (keyCode == DOWN) { // DELETE
ms_xy.clearWaves();
}
}