From 5c7c7d242fa943ec7a96de4a43efa3fc6b1ef77a Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 20 Dec 2014 23:50:33 +0100 Subject: =?UTF-8?q?nixify=20K=C3=BCbelwagen=20(without=20UTF-8=20:/)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- K_belwagen/Makefile | 14 ++++ K_belwagen/alarm | 27 +++++++ K_belwagen/default.nix | 25 ++++++ K_belwagen/index.c | 206 +++++++++++++++++++++++++++++++++++++++++++++++++ K_belwagen/playmobil | 12 +++ K_belwagen/sin.js | 37 +++++++++ 6 files changed, 321 insertions(+) create mode 100644 K_belwagen/Makefile create mode 100755 K_belwagen/alarm create mode 100644 K_belwagen/default.nix create mode 100644 K_belwagen/index.c create mode 100755 K_belwagen/playmobil create mode 100644 K_belwagen/sin.js (limited to 'K_belwagen') diff --git a/K_belwagen/Makefile b/K_belwagen/Makefile new file mode 100644 index 00000000..9be84e13 --- /dev/null +++ b/K_belwagen/Makefile @@ -0,0 +1,14 @@ + +CC := gcc -std=c99 +CFLAGS := -D_XOPEN_SOURCE=500 +LIBS := $(shell pkg-config --cflags --libs jack) -lm + +.PHONY: all clean + +all: a.out + +clean: + rm -f a.out + +a.out: index.c + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) diff --git a/K_belwagen/alarm b/K_belwagen/alarm new file mode 100755 index 00000000..a117c433 --- /dev/null +++ b/K_belwagen/alarm @@ -0,0 +1,27 @@ +#! /bin/sh +# +# //Kübelwagen/alarm SLEEPARGS... +# +# where SLEEPARGS are passed to sleep(3) +# +set -euf +cd $(dirname $(readlink -f $0)) +exec >&2 + +make + +jackd -d alsa & +trap "kill -0 $! && kill $!" EXIT INT + +for i in `seq 8000 1000 10000`; do + echo $i 100 +done | ./a.out 1 +echo 'if you heard that sound, then goto sleep..^_^' + +echo sleep "$@" +sleep "$@" + +echo 'wake up!' +while :; do + echo $(echo "($(od -tu -An -N 2 /dev/urandom)%1000)+500"|bc) $(echo "($(od -tu -An -N 2 /dev/urandom)%500)+100"|bc) +done | ./a.out 1 diff --git a/K_belwagen/default.nix b/K_belwagen/default.nix new file mode 100644 index 00000000..c284ac86 --- /dev/null +++ b/K_belwagen/default.nix @@ -0,0 +1,25 @@ +{ pkgs ? import {} }: + +# TODO check if system has jack2 installed + +pkgs.stdenv.mkDerivation { + name = "K_belwagen-1"; + + src = ./.; + + buildInputs = with pkgs; [ + coreutils + jack2 + pkgconfig + ]; + + installPhase = '' + mkdir -p $out/bin $out/lib + cp alarm $out/bin + cp a.out $out/lib + sed -i ' + s:^\(jackd\|trap\|make\|cd\)\>:#&: + s:\./a\.out:'$out/lib/a.out': + ' $out/bin/alarm + ''; +} diff --git a/K_belwagen/index.c b/K_belwagen/index.c new file mode 100644 index 00000000..9a15c7c3 --- /dev/null +++ b/K_belwagen/index.c @@ -0,0 +1,206 @@ +#include +#include +#include +#include +#include + +#include + +const double PI = 3.14; + +/*Our output port*/ +jack_port_t *output_port; + +typedef jack_default_audio_sample_t sample_t; + +/*The current sample rate*/ +jack_nframes_t sr; + +/*samples in cycle*/ +jack_nframes_t samincy; +/*the current offset*/ +long offset=0; + +/*frequency of our sound*/ +int tone = 262; +int length = 1000000; + +char const *name = ""; + +int process (jack_nframes_t nframes, void *arg){ + /*grab our output buffer*/ + sample_t *out = (sample_t *) jack_port_get_buffer + (output_port, nframes); + + int _tone = tone > 0 ? tone : 1; + + /*For each required sample*/ + for(jack_nframes_t i=0;i < nframes;i++){ + /*Copy the sample at the current position in the cycle to the buffer*/ + + jack_nframes_t samincy = sr / _tone; + sample_t scale = 2 * PI / samincy; + out[i] = sin(offset * scale); + + /*and increment the offset, wrapping to 0 if needed*/ + /*(Dumb increment fixed thanks to Jussi Sainio)*/ + offset++; + if(offset >= samincy) + offset = 0; + } + + return 0; +} + +int srate (jack_nframes_t nframes, void *arg){ + printf ("the sample rate is now %lu/sec\n", nframes); + sr=nframes; + return 0; +} + +void error (const char *desc){ + fprintf (stderr, "JACK error: %s\n", desc); +} + +void jack_shutdown (void *arg){ + exit (1); +} + +void usage(void) { + fprintf (stderr, "usage: %s [Hz [ms]]\n", name); +} + +int main (int argc, char *argv[]){ + jack_client_t *client; + const char **ports; + + name = argv[0]; + + if (argc < 2) { + usage(); + return 1; + } + if (argc >= 2) { + tone = atoi(argv[1]); + if (tone == 0) { + usage(); + return 1; + } + fprintf(stderr, "tone: %dHz\n", tone); + if (argc >= 3) { + length = atoi(argv[2]) * 1000; + if (length == 0) { + usage(); + return 1; + } + fprintf(stderr, "length: %dms\n", length/1000); + } + } + + /* tell the JACK server to call error() whenever it + experiences an error. Notice that this callback is + global to this process, not specific to each client. + + This is set here so that it can catch errors in the + connection process + */ + jack_set_error_function (error); + + /* try to become a client of the JACK server */ + + if ((client = jack_client_open(argv[0], JackNullOption, NULL)) == 0) { + fprintf (stderr, "jack server not running?\n"); + return 1; + } + + /* tell the JACK server to call `process()' whenever + there is work to be done. + */ + + jack_set_process_callback (client, process, 0); + + /* tell the JACK server to call `srate()' whenever + the sample rate of the system changes. + */ + + + jack_set_sample_rate_callback (client, srate, 0); + + /* tell the JACK server to call `jack_shutdown()' if + it ever shuts down, either entirely, or if it + just decides to stop calling us. + */ + + jack_on_shutdown (client, jack_shutdown, 0); + + /* display the current sample rate. once the client is activated + (see below), you should rely on your own sample rate + callback (see above) for this value. + */ + printf ("engine sample rate: %lu\n", jack_get_sample_rate (client)); + + + sr=jack_get_sample_rate (client); + + /* create two ports */ + + + output_port = jack_port_register (client, "output", + JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); + + /* tell the JACK server that we are ready to roll */ + + if (jack_activate (client)) { + fprintf (stderr, "cannot activate client"); + return 1; + } + + /* connect the ports*/ + if ((ports = jack_get_ports (client, NULL, NULL, + JackPortIsPhysical|JackPortIsInput)) == NULL) { + fprintf(stderr, "Cannot find any physical playback ports\n"); + exit(1); + } + + int i=0; + while(ports[i]!=NULL){ + if (jack_connect (client, jack_port_name (output_port), ports[i])) { + fprintf (stderr, "cannot connect output ports\n"); + } + i++; + } + + free (ports); + + //while (1) { //scanf("%i %i", &tone, &length) == 2) { + char buf[BUFSIZ]; + while (fgets(buf, BUFSIZ, stdin) == buf) { + //if (strstr(buf, "Hz\n")) { + // sscanf(buf, "%i", &tone); + // fprintf(stderr, "%dHz\n", tone); + //} + //if (strstr(buf, "us\n")) { + // sscanf(buf, "%i", &length); + // fprintf(stderr, "%dus\n", length); + //} + + int length = 0; + int c; + int pos = 0, n; + while ((c = sscanf(buf + pos, "%i%i%n", &tone, &length, &n)) == 2) { + + if (length > 0) { + usleep(length * 1000); + } + + pos += n; + + fprintf(stderr, "%dHz %dms\n", tone, length); + } + } + ///* 3 seconds of bleep is plenty*/ + ///usleep(length); + jack_client_close(client); + + exit(0); +} diff --git a/K_belwagen/playmobil b/K_belwagen/playmobil new file mode 100755 index 00000000..51ed70d6 --- /dev/null +++ b/K_belwagen/playmobil @@ -0,0 +1,12 @@ +#! /bin/sh +file=`mktemp` +trap "rm -f $file" EXIT INT TERM + +gcc -xc -lm -o $file - < +main(t) { + for (t=${2-0};;++t) putchar($1); +} +EOF + +$file | aplay diff --git a/K_belwagen/sin.js b/K_belwagen/sin.js new file mode 100644 index 00000000..0f472715 --- /dev/null +++ b/K_belwagen/sin.js @@ -0,0 +1,37 @@ + + + +var x = 3000; + +var t = 0; +var i = 0; +var j = 0.00001; +var t0 = new Date(); +(function rec () { + + var t1 = new Date(); + console.error('dt = ' + (t1 - t0)); + t0 = t1; + + if (x === 3000) { + x = 1000; + } else { + x = 3000; + }; + + console.log('2000 50 0 50 2000 50 0 50 ' + x + ' 100 0 0'); + return setTimeout(rec, 1000); + + i += 0.01; + console.log((2000 + Math.sin(i) * 1000 | 0) + ' 0'); + return setTimeout(rec, 1); + + var f = Math.abs(1000 + 500 * Math.tan( t )); + var scale = 1; + + console.log(((f * scale)|0) + ' 0'); + + t++; + setTimeout(rec, 100); + //process.nextTick(rec); +})(); -- cgit v1.2.3