diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | shader.frag | 41 | ||||
-rw-r--r-- | sv.c | 69 |
3 files changed, 91 insertions, 21 deletions
@@ -1,2 +1,2 @@ sv: sv.c - gcc -lglfw -lGL -lGLEW -lpthread -lm sv.c -o sv + gcc -lglfw -lGL -lGLEW -lpthread -lm -lasound sv.c -o sv diff --git a/shader.frag b/shader.frag index c6cc012..0141563 100644 --- a/shader.frag +++ b/shader.frag @@ -4,11 +4,11 @@ precision mediump float; #endif uniform vec2 resolution; -uniform float time; +uniform float ticks; +uniform int program; uniform sampler2D images[4]; layout (binding = 0,rgba32f) uniform image2D backbuffer; -//uniform image2DArray buffers; uniform float ratios[4]; uniform float params[32]; @@ -18,25 +18,34 @@ float random (in float x) { return fract(sin(x)*43758.5453123)-0.5; } -vec4 image(int i) { +vec4 img(int i) { vec2 st = gl_FragCoord.xy/resolution.xy; st.x *= ratios[i]; st.x += (1-ratios[i])*0.5; - st.x += 0.5*time; + st.x += 0.5; return texture2D(images[i],st); } void main (void) { - vec4 img1 = mix(image(0),image(1),sin(time)); - vec4 img2 = mix(image(2),image(3),cos(time)); - ivec2 P = ivec2(gl_FragCoord.xy); - vec4 buf = imageLoad(backbuffer,P); - buf.rg = buf.gr; - //buf.b = 0.0; - vec4 i = mix(img1,img2,0.5); - //P = ivec2(gl_FragCoord.xy); - imageStore(backbuffer,P,i); - i = mix(i,buf,0.8); - //i = image(0); - fragColor = i; + vec4 image = img(0); + if (program == 0) { + image = img(2); + image.rg = image.gr; + image = 1.5*image; + } + /* + else { + ivec2 P = ivec2(gl_FragCoord.xy); + vec4 buf = imageLoad(backbuffer,P); + vec4 img1 = mix(img(0),img(1),sin(ticks)); + vec4 img2 = mix(img(2),img(3),cos(ticks)); + buf.bg = buf.gr; + //buf.b = 0.0; + vec4 i = mix(img1,img2,0.5); + //P = ivec2(gl_FragCoord.xy); + imageStore(backbuffer,P,i); + image = mix(i,buf,0.8); + } + */ + fragColor = image; } @@ -7,12 +7,15 @@ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> +#include <alsa/asoundlib.h> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" +#define MIDICHK(stmt, msg) if((stmt) < 0) {puts("ERROR: "#msg); exit(1);} + int width = 1920; int height = 1080; GLFWwindow* window; @@ -47,6 +50,15 @@ typedef struct Param { Parameter parameters[32]; +static snd_seq_t *seq_handle; +static int in_port; + +void midi_open(void) { + MIDICHK(snd_seq_open(&seq_handle, "default", SND_SEQ_OPEN_INPUT, 0), "Could not open sequencer"); + MIDICHK(snd_seq_set_client_name(seq_handle, "Midi Listener"), "Could not set client name"); + MIDICHK(in_port = snd_seq_create_simple_port(seq_handle, "listen:in", SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE, SND_SEQ_PORT_TYPE_APPLICATION), "Could not open port"); +} + void screenshot() { unsigned char pixels[width*height*4]; time_t current_time = time(NULL); @@ -196,6 +208,48 @@ void updateParams(int force) { } } +int ticks =0; +int running = 0; +int note = 0; +int vel = 0; + +void *readMidi() { + midi_open(); + while(1) { + snd_seq_event_t *ev = NULL; + snd_seq_event_input(seq_handle, &ev); + if (ev->type == SND_SEQ_EVENT_NOTEON) { + note = ev->data.note.note; + vel = ev->data.note.velocity; + } + else if (ev->type == SND_SEQ_EVENT_NOTEOFF) { + vel = 0; + } + else if(ev->type == SND_SEQ_EVENT_CONTROLLER) + printf("[%d] Control: %2x val(%2x)\n", ev->time.tick, + ev->data.control.param, + ev->data.control.value); + else if(ev->type == SND_SEQ_EVENT_SONGPOS) { + ticks = ev->data.control.value*24; + printf("[%d] SPP: %i val(%i)\n", ev->time.tick, + ev->data.control.param, + ev->data.control.value); + } + else if(ev->type == SND_SEQ_EVENT_START) + running = 1; + else if(ev->type == SND_SEQ_EVENT_STOP) + running = 0; + else if(ev->type == SND_SEQ_EVENT_CONTINUE) + running = 1; + else if(ev->type == SND_SEQ_EVENT_CLOCK) { + if (running == 1) ticks++; + } + else + printf("[%d] Unknown: Unhandled Event Received\n", ev->time.tick); + } +} + + void *readStdin() { while (1) { char * str; @@ -252,13 +306,19 @@ int main(int argc, char **argv) { glTextureStorage2D(backbuffer,1,GL_RGBA32F,width,height); glBindImageTexture(0,backbuffer, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F); - pthread_t stdin_t; - pthread_create(&stdin_t, NULL, readStdin, NULL); + //pthread_t stdin_t; + //pthread_create(&stdin_t, NULL, readStdin, NULL); + pthread_t midiin_t; + pthread_create(&midiin_t, NULL, readMidi, NULL); pthread_t frag_t; pthread_create(&frag_t, NULL, watchShader, NULL); while (!glfwWindowShouldClose(window)) { - glUniform1f(glGetUniformLocation(shader.id, "time"),glfwGetTime()); + //glUniform1f(glGetUniformLocation(shader.id, "time"),glfwGetTime()); + //glUniform1f(glGetUniformLocation(shader.id, "time"),glfwGetTime()); + glUniform1f(glGetUniformLocation(shader.id, "ticks"),(float)ticks); + //printf("%i\n",note); + glUniform1i(glGetUniformLocation(shader.id, "program"),note-36); if (shader.new) { createShader(); glUniform2f(glGetUniformLocation(shader.id, "resolution"),width,height); // important!! @@ -273,7 +333,8 @@ int main(int argc, char **argv) { glfwPollEvents(); } - pthread_cancel(stdin_t); + //pthread_cancel(stdin_t); + pthread_cancel(midiin_t); pthread_cancel(frag_t); glfwDestroyWindow(window); glfwTerminate(); |