diff --git a/.depend b/.depend index 42fe8b2..fc89c2a 100644 --- a/.depend +++ b/.depend @@ -1,50 +1,55 @@ # DO NOT DELETE -raw2disk.o: sample.h -readsample.o: conv_ieee_ext.h sample.h voncendian.h -controls.o: gpm-xterm.h semaphore.h controls.h radio.h -fileselect.o: placement.h sample.h controls.h radio.h alert.h fileselect.h -alert.o: controls.h radio.h alert.h +raw2disk.o: config.h sample.h +readsample.o: conv_ieee_ext.h config.h sample.h voncendian.h +controls.o: config.h gpm-xterm.h semaphore.h controls.h radio.h +fileselect.o: config.h placement.h sample.h controls.h radio.h alert.h +fileselect.o: fileselect.h +alert.o: config.h controls.h radio.h alert.h tokenio.o: tokenio.h controls.h radio.h voncendian.h -grov_io.o: sample.h readsample.h tokenio.h grov_io.h grpattern.h radio.h -grov_io.o: grevents.h grsequence.h granalogik.h resoanlog.h grdyfilter.h -grov_io.o: grdelay.h constants.h controls.h groovit.h menu_board.h grmixeur.h -grov_io.o: voncendian.h +grov_io.o: config.h sample.h readsample.h tokenio.h grov_io.h grpattern.h +grov_io.o: radio.h grevents.h grsequence.h granalogik.h resoanlog.h +grov_io.o: grdyfilter.h grdelay.h constants.h controls.h groovit.h +grov_io.o: menu_board.h grmixeur.h voncendian.h gpm-xterm.o: gpm-xterm.h -settings.o: sample.h grov_io.h placement.h controls.h radio.h fileselect.h -settings.o: settings.h -dialogs.o: sample.h placement.h controls.h radio.h alert.h fileselect.h -dialogs.o: grsel.h menu_board.h resoanlog.h grpattern.h grevents.h -dialogs.o: grsequence.h grdyfilter.h settings.h groovit.h constants.h -grsel.o: sample.h placement.h controls.h radio.h alert.h fileselect.h -grsel.o: readsample.h grov_io.h raw2disk.h menu_board.h resoanlog.h -grsel.o: grpattern.h grevents.h grsequence.h grdyfilter.h groovit.h -grsel.o: constants.h -grpattern.o: controls.h radio.h sample.h readsample.h placement.h groovit.h -grpattern.o: constants.h grlevels.h grmixeur.h menu_board.h resoanlog.h -grpattern.o: grpattern.h grevents.h grsequence.h grdyfilter.h -granalogik.o: controls.h radio.h sample.h placement.h grlevels.h grmixeur.h -granalogik.o: groovit.h constants.h menu_board.h resoanlog.h grpattern.h -granalogik.o: grevents.h grsequence.h grdyfilter.h granalogik.h -menu_board.o: sample.h placement.h controls.h radio.h dialogs.h grsel.h -menu_board.o: settings.h grpattern.h grevents.h grsequence.h granalogik.h -menu_board.o: resoanlog.h grdyfilter.h grdelay.h constants.h grlevels.h -menu_board.o: grderiv.h groovit.h menu_board.h -resoanlog.o: resoanlog.h radio.h sample.h placement.h groovit.h constants.h -grdelay.o: controls.h radio.h sample.h placement.h grlevels.h grmixeur.h -grdelay.o: groovit.h constants.h grdelay.h -grmixeur.o: grlevels.h grmixeur.h -grlevels.o: sample.h placement.h controls.h radio.h grmixeur.h grlevels.h -grdyfilter.o: controls.h radio.h sample.h placement.h groovit.h constants.h -grdyfilter.o: menu_board.h resoanlog.h grpattern.h grevents.h grsequence.h -grdyfilter.o: grdyfilter.h grmixeur.h grlevels.h granalogik.h -groovit.o: placement.h tokenio.h grov_io.h raw2disk.h sample.h readsample.h -groovit.o: controls.h radio.h menu_board.h resoanlog.h grpattern.h grevents.h -groovit.o: grsequence.h grdyfilter.h settings.h dialogs.h grsel.h grmixeur.h -groovit.o: granalogik.h grdelay.h constants.h grderiv.h groovit.h -grderiv.o: controls.h radio.h sample.h placement.h grlevels.h grmixeur.h -grderiv.o: groovit.h constants.h grderiv.h +settings.o: config.h sample.h grov_io.h placement.h controls.h radio.h +settings.o: fileselect.h settings.h +dialogs.o: config.h sample.h placement.h controls.h radio.h alert.h +dialogs.o: fileselect.h grsel.h menu_board.h resoanlog.h grpattern.h +dialogs.o: grevents.h grsequence.h grdyfilter.h settings.h groovit.h +dialogs.o: constants.h +grsel.o: config.h sample.h placement.h controls.h radio.h alert.h +grsel.o: fileselect.h readsample.h grov_io.h raw2disk.h menu_board.h +grsel.o: resoanlog.h grpattern.h grevents.h grsequence.h grdyfilter.h +grsel.o: groovit.h constants.h +grpattern.o: config.h controls.h radio.h sample.h readsample.h placement.h +grpattern.o: groovit.h constants.h grlevels.h grmixeur.h menu_board.h +grpattern.o: resoanlog.h grpattern.h grevents.h grsequence.h grdyfilter.h +granalogik.o: config.h controls.h radio.h sample.h placement.h grlevels.h +granalogik.o: grmixeur.h groovit.h constants.h menu_board.h resoanlog.h +granalogik.o: grpattern.h grevents.h grsequence.h grdyfilter.h granalogik.h +menu_board.o: config.h sample.h placement.h controls.h radio.h dialogs.h +menu_board.o: grsel.h settings.h grpattern.h grevents.h grsequence.h +menu_board.o: granalogik.h resoanlog.h grdyfilter.h grdelay.h constants.h +menu_board.o: grlevels.h grderiv.h groovit.h menu_board.h +resoanlog.o: config.h resoanlog.h radio.h sample.h placement.h groovit.h +resoanlog.o: constants.h +grdelay.o: config.h controls.h radio.h sample.h placement.h grlevels.h +grdelay.o: grmixeur.h groovit.h constants.h grdelay.h +grmixeur.o: config.h grlevels.h grmixeur.h +grlevels.o: config.h sample.h placement.h controls.h radio.h grmixeur.h +grlevels.o: grlevels.h +grdyfilter.o: config.h controls.h radio.h sample.h placement.h groovit.h +grdyfilter.o: constants.h menu_board.h resoanlog.h grpattern.h grevents.h +grdyfilter.o: grsequence.h grdyfilter.h grmixeur.h grlevels.h granalogik.h +groovit.o: config.h placement.h tokenio.h grov_io.h raw2disk.h sample.h +groovit.o: readsample.h controls.h radio.h menu_board.h resoanlog.h +groovit.o: grpattern.h grevents.h grsequence.h grdyfilter.h settings.h +groovit.o: dialogs.h grsel.h grmixeur.h granalogik.h grdelay.h constants.h +groovit.o: grderiv.h groovit.h +grderiv.o: config.h controls.h radio.h sample.h placement.h grlevels.h +grderiv.o: grmixeur.h groovit.h constants.h grderiv.h grevents.o: grevents.h -grsequence.o: placement.h controls.h radio.h groovit.h constants.h sample.h -grsequence.o: grpattern.h grevents.h grsequence.h granalogik.h resoanlog.h -grsequence.o: grdyfilter.h +grsequence.o: config.h placement.h controls.h radio.h groovit.h constants.h +grsequence.o: sample.h grpattern.h grevents.h grsequence.h granalogik.h +grsequence.o: resoanlog.h grdyfilter.h diff --git a/Configure b/Configure index 75c3dee..b43a937 100755 --- a/Configure +++ b/Configure @@ -334,7 +334,7 @@ echo "a few question to Configure it all good..." echo "in a pintch just press RETURN for the default answer in [bracket]." echo -VERSION='1.5' +VERSION=`echo $Id: Configure,v 1.2 2003/03/19 16:45:47 jd Exp $ | cut -d' ' -f3` FINAL=groovit PREFIX=/usr/local LIBDIR=$PREFIX/lib/groovit @@ -687,18 +687,6 @@ else CURSESLIB=" " fi -echo looking for jack ... -if pkg-config --exists jack -then - echo will build with jack. - JACKLIBS=" "`pkg-config --cflags --libs jack`" " - HAVE_JACK='Y' -else - echo pkg-config didn"'"t find jack. - JACKLIBS=" " - HAVE_JACK='N' -fi - echo -n "checking termios, " rm -f testtermios.c testtermios.out testtermios echo -e "#include \n#define JDCTRL(x) (x&037)\nint main (void)\n{ char c;\nstruct termios caracs;\ntcgetattr (0, &caracs);\nc=caracs.c_cc[3];\ncaracs.c_cc[3]=JDCTRL('H');\nif(tcsetattr (0, TCSANOW, &caracs))return 1;\ncaracs.c_cc[3]=c;\nif(tcsetattr (0, TCSANOW, &caracs))return 1;\nreturn 0;\n}"> testtermios.c @@ -849,7 +837,7 @@ then fi fi -readit "want to zero input level of all recording devices when playin' ?" "n" +readit "want to zero input level of all recording devices when playin' ?" "y" ZEROINGINPUT=$VALUE if [ $ZEROINGINPUT = "y" ] then @@ -1026,12 +1014,6 @@ else echo "#define HAVECURSES" fi fi -if [ $HAVE_JACK = "y" ] -then - echo "#define HAVE_JACK 1" -else - echo "/* #define HAVE_JACK 1 */" -fi if [ $HAVE_LIBGPM = "y" ] then echo "#define HAVE_LIBGPM 1" @@ -1164,8 +1146,7 @@ echo -n "generating additlib ... " echo -n " -lgpm " fi - echo -n "$CURSESLIB" - echo -n "$JACKLIBS" + echo -n $CURSESLIB ) > ./additlib echo " ...done : will link with " `cat ./additlib` echo @@ -1177,7 +1158,7 @@ then mv installer installer.bak fi echo -n "generating installer ... " -( echo '#!/bin/bash' +( echo '#!/bin/sh' echo 'LIBDIR'=$LIBDIR echo 'SAMPLEDIR'=$SAMPLEDIR echo 'DESTDIR'=$DESTDIR diff --git a/Makefile b/Makefile index 35bfe4f..413eea5 100644 --- a/Makefile +++ b/Makefile @@ -64,15 +64,14 @@ TARDIR = $(HOME)/tar DICTDIR = $(HOME) CC = `./.cc` - VERSION = '1.5' -# VERSION = `rlog -r RCS/$(FINAL).c,v | grep "revision " | cut -d' ' -f2 | cut -f1` + VERSION = `rlog -r RCS/$(FINAL).c,v | grep "revision " | cut -d' ' -f2 | cut -f1` # PSEUDO = -# PSEUDO = "áéáà-ìú" - PSEUDO = walden +# PSEUDO = "����-��" + PSEUDO = telaviv CC_OBJ = -c # CC_STAMP = -DCCUNAMED="\"`uname -n` `uname -s` `uname -r`\"" -DCCCONFEDBY="\"`whoami` `date "+%d-%m-%Y %H:%M"`\"" CC_STAMP = -DCCUNAMED="\"`./.inu`\"" -DCCCONFEDBY="\"`./.woa`\"" - CC_OPTIONS = -g -Winline -Wall -O3 + CC_OPTIONS = -g -Winline -Wall -O3 -fcommon ## CC_DEBUG = -g -DFAKEDSP ## CC_DEBUG = -DFAKEDSP @@ -92,10 +91,8 @@ # CTAGS = ccproc -t SHELL = /bin/sh -default: $(FINAL) - -# .h.c: -# ls $@ | grep $@ > /dev/null 2> /dev/null || co $@ +.h.c: + ls $@ | grep $@ > /dev/null 2> /dev/null || co $@ .c.o: @echo @@ -112,10 +109,6 @@ test: all @echo ./$(FINAL) -fixedpos 40+40 test.grov && echo fini || ./$(FINAL) -fixedpos 40+40 test.grov -fakedsp -vimtest: all - # xterm +lc +u8 -fn 10x20 -bg black -fg white -geometry 80x25+40+40 -e ./groovit -noX - ./$(FINAL) -fixedpos 40+40 -jack | tr ':' '=' - $(FINAL): $(OBJ) additlib $(OBJBIS) @echo $(CC) $(CC_OPTIONS) $(CC_STAMP) -o $(FINAL) $(OBJ) $(ADDITLIB) $(LIB) diff --git a/README.md b/README.md new file mode 100644 index 0000000..3617f4f --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +# Groovit + +**Making accurate and groovy sound/noise.** + +Groovit is an all-in-a-box beat-box for Linux. It runs in any ANSI terminal and its main parts are: + +- **Drum matrix** — step-sequencer for sample-based drum voices +- **Analog synth voices** — oscillator-based synthesis with envelopes +- **Dynamic filter** — resonant filter with envelope control +- **Mixer** — per-voice volume and pan + +Songs are stored as `.grov` files. Samples are read from WAV and AIFF files. + +## Building on modern Linux + +### Dependencies + +```sh +sudo apt install build-essential libncurses-dev oss-compat alsa-oss +``` + +### Compile + +```sh +make config # interactive configuration +make # compile +``` + +For a non-interactive build: + +```sh +make fastconfig && make +``` + +> **GCC 10+ note:** GCC 10 changed the default to `-fno-common`, which breaks this codebase. +> The Makefile includes `-fcommon` to restore the previous behaviour. + +### Run + +OSS audio (`/dev/dsp`) is required. On modern ALSA-only systems, load the OSS +compatibility module first, then use `aoss`: + +```sh +sudo modprobe snd-pcm-oss +aoss ./groovit myfile.grov +``` + +To avoid running `modprobe` on every boot, add it to your modules: + +```sh +echo snd-pcm-oss | sudo tee /etc/modules-load.d/oss.conf +``` + +## Usage + +```sh +groovit [options] [start-file.grov ...] +``` + +Key options: + +| Option | Description | +|--------|-------------| +| `-noX` | Force terminal mode even if `DISPLAY` is set | +| `-fakedsp` | Run without audio (silent mode) | +| `-jack[=name]` | Use JACK audio instead of OSS | +| `-rc rcfile` | Use an alternate config file | +| `-raw file.wav` | Record output to a WAV file | +| `-err filename` | Redirect error messages to a file | + +When `DISPLAY` is set, groovit forks into a new xterm automatically. Use `-noX` to stay in the current terminal. + +## Install + +```sh +sudo make install +``` + +Installs the binary, man pages and shared samples under `/usr/local` by default. + +## File format + +`.grov` files are groovit's native song format. See `man 5 grov` after installation. + +## License + +GNU General Public License v2 — see [GPL.txt](GPL.txt). + +Copyright (C) 1998, 1999 Jean-Daniel PAUGET diff --git a/controls.c b/controls.c index 6098794..7202b9e 100644 --- a/controls.c +++ b/controls.c @@ -270,7 +270,7 @@ typedef struct tjmeta /* la structure de jmeta controls */ } JMeta; -JMeta jmeta[8]; /* les handles des jmeta */ +JMeta jmeta[6]; /* les handles des jmeta */ #ifdef SIMPLE_MEMPROFILE static long totdivs = 0; @@ -651,7 +651,7 @@ void initjmeta (void) { int i; - for (i = 0; i < 8; i++) + for (i = 0; i < 6; i++) clearjmeta (i); keyhandler[CONTKEY_F1] = 0; keyhandler[CONTKEY_F2] = 0; @@ -713,49 +713,6 @@ void actionnejmeta (int m, int c) keycontrols (jmeta[m].member[i], c); } -void actionnedirectjmeta (int m, int val) -{ - int i; - - for (i = 0; i < jmeta[m].nb; i++) - keydirectcontrols (jmeta[m].member[i], val); -} - -int keydirectcontrols (int h, int val) /* returns 0 if the control cannot support direct */ -{ - int *p = (int *) controls[h].p; - - lastpressed = h; - switch (controls[h].type) - { - case CONTRVSLIDE: /* slide vertical - keycontrols */ - case CONTRHSLIDE: /* slide horizontal - keycontrols */ - if (p != NULL) - { - if (val > 256) - *p = 256; - else if (val < 0) - *p = 0; - else - *p = val; - - controls[h].nbmodif++; - if (controls[h].pression != NULL) - controls[h].pression (controls[h].evtype, controls[h].voice, *p); - - if (controls[h].associated != CONTUNDEF) - refreshcontrols (controls[h].associated); - refreshcontrols (h); - return (1); - } - break; - default: - return 0; - } - - return (0); -} - int keycontrols (int h, int c) /* returns 0 if the char is NOT handled */ { int *p = (int *) controls[h].p; @@ -1165,7 +1122,7 @@ int clickcontrols (int h, int x, int y, int buttons, int focuschanged) if (focuschanged && sauveh) addjmeta (0, h); else - addjmeta ((sauveh + 1) % 8, h); + addjmeta ((sauveh + 1) % 6, h); break; } if (focuschanged && (buttons != 4)) diff --git a/controls.h b/controls.h index 0fdd8fb..bb061de 100644 --- a/controls.h +++ b/controls.h @@ -33,7 +33,7 @@ #define MAXCONTEXTS 16 /* nombre maxi de contexts */ #define MAXSCREENWIDTH 160 /* largeur maxi en caracteres */ #define MAXSCREENHEIGHT 80 /* hauteur maxi */ -#define MAXNBCONTROLS 1024 /* nombre max de controls */ +#define MAXNBCONTROLS 484 /* nombre max de controls */ #define MAXMETAMEMBER 64 /* nombre maxi de metahandlers */ @@ -164,11 +164,6 @@ int createcontexts (int x, int y, int lx, int ly, int col, char *name, Tacti /* creer un contexts de ss fenetre */ void actionnecontexts (int h, Tactionne actionne); -// ajoutes pour permettre le control des meta en midi .... -extern int focus; -int keydirectcontrols (int h, int val); -void actionnedirectjmeta (int m, int val); - // int registertocontexts (int ctx, int ctl); /* ajouter un controls au // contexts */ /* l'enregistrement est desormais automatique */ diff --git a/groovit.c b/groovit.c index ff14eee..2a7d2b7 100644 --- a/groovit.c +++ b/groovit.c @@ -110,9 +110,6 @@ #include #include -#include -#include - #include /* #include */ @@ -396,8 +393,8 @@ int initmixer (void) fmixer = open (MIXER, O_WRONLY); if (fmixer == -1) - { int e = errno; - fprintf (stderr, "impossible d'ouvrir %s : %s\n", MIXER, strerror (e)); + { + fprintf (stderr, "impossible d'ouvrir %s\n", MIXER); return (-1); } @@ -636,12 +633,6 @@ void init_arbitr (void) abitr_analogik (); abitr_dyfilter (); - { int i; - for (i=0 ; itime, event->size); - for (j=0 ; jsize ; j++) { - fprintf (std, "%02x ", ((unsigned char *)event->buffer)[j]); - if (j == 0) - fprintf (std, "(%1x %02d) ",(0xf0 & ((unsigned char *)event->buffer)[j]) >> 4, (0x0f & ((unsigned char *)event->buffer)[j]) ); - } - fprintf (std, "\n"); -} +#ifdef RINGMODULATOR +/* RING MODULATOR TEST */ + int lring = 1, rring = 1; -int mainloop (jack_nframes_t nframes, void *jack_arg) -{ +#endif - int i, /* compteur a tout faire */ + int fdsp, /* dsp file handle pour ecriture */ + forcedfakedsp = 0, /* mode fakedsp force */ + nbconterr = 0, /* nombre d'erreur cumulees */ + passe, /* compteur de passe pour la ligne de commande */ + i, /* compteur a tout faire */ voice; /* compteur de voix */ + int noX = 0, /* on ne veut pas forker de X */ + usage = 0, /* afficher l'usage */ + letsreadfile = 0; /* on nous demande de lire un fichier */ int lastpressed = -1; /* dernier controle presse */ + #ifdef HANDLE_JOY + int fjs1, /* joystick #1 */ + fjs2; /* joystick #2 */ struct JS_DATA_TYPE js; /* buffer de lecture des joysticks */ -#endif - - jack_default_audio_sample_t *jackoutr = - (jack_default_audio_sample_t *) jack_port_get_buffer (output_portr, nframes); - jack_default_audio_sample_t *jackoutl = - (jack_default_audio_sample_t *) jack_port_get_buffer (output_portl, nframes); - - if (1) - { jack_midi_event_t event; - long i, n; - void* midiin_buf = jack_port_get_buffer(midi_input, nframes); - n = (long) jack_midi_get_event_count(midiin_buf); - for (i=0 ; i 0) { - int took_care = 0; - if ( (((unsigned char *)event.buffer)[0] & 0xf0 ) == 0xb0 ) { /* a continuous midi control */ - int control = ((unsigned char *)event.buffer)[1]; - if ((control >= 1) && (control <=7)) { - actionnedirectjmeta (control, (((unsigned char *)event.buffer)[2]) << 1); /* value are 7 bits, multiply them ... */ - took_care = 1; - } - else if (control == 8) { - keydirectcontrols (focus, (((unsigned char *)event.buffer)[2]) << 1); /* value are 7 bits, multiply them ... */ - took_care = 1; - } - } else if ( (((unsigned char *)event.buffer)[0] & 0xf0 ) == 0x90 ) { /* a pad begin sound */ - int channel = ((unsigned char *)event.buffer)[0] & 0x0f; - int control = ((unsigned char *)event.buffer)[1]; - if ((channel == 0) && (control>=0x24) && (control<=0x2b)) { -// pattpatbut.nncurpattern = control - 0x24; - refrsyncPatbut (&pattpatbut, control - 0x24); - took_care = 1; - } - } - if (!took_care) - dumpmidi (stderr, &event); - } - } - } - } - { -#ifdef HOPEDMONO16 - pbuf = (unsigned short *) &reserve[0][0]; -#endif -#ifdef HOPEDRESO16 - pbuf = (unsigned short *) &reserve[0][0]; #endif -#ifdef HOPEDRESO8 - pbuf = (unsigned char *) &reserve[0][0]; -#endif - totleft = 0; - totright = 0; - maxleft = 0; - maxright = 0; - if (isplayin == BUT_ON) - { - long theplayahead; - if (usejack) - theplayahead = nframes; - else - theplayahead = playahead; - - for (tss = ts, endtss = theplayahead; endtss; endtss--, tss++, nss--) - { - if (!nss) /* la on passe d'un tick a l'autre */ - { -/* JDJDJDJD l'avenir dira si cette methode est bone... */ - if (isreplaying) tickchange_play (); - voice = 0; + char *fixedpos = NULL; /* coordonnees de la fenetre en position fixee */ + char *nftobeload = NULL; /* le fichier a lire au demarrage */ + char *rcfile = NULL; /* le rcfile en cours (null=default) */ - lnss = UNJBPM / bpm; - nss = lnss; -/* later (in a few) thoses functions would have been registered */ - voice = tickchange_pattern (voice); - voice = tickchange_analogik (voice); - voice = tickchange_dyfilter (voice); - voice = tickchange_delay (voice); +#ifdef ALARMHANDLER + struct sigaction signal_alrm; /* structure de gestion du timer de polling */ - t++; - } +#endif -/* mise a zero des cumuls generaux */ - l = 0; - r = 0; +#ifdef DDD_DEBUG + fprintf (stderr, "debugging with ddd my PID is %d !\n", getpid ()); + getchar (); +#endif -/* ----------controles des amplitudes - (envellopes)-------------------------------------------- */ -/* JDJDJDJD remplacer par un generateur d'envellopes */ + /* JDJDJDJD il faudrait enlever ca au plus vite ... */ + rustine (); + nfoutbis[0] = 0; - if ((tss & AMPTESTMASK) == 0) - { - for (i = 0; i < MAXANALOG; i++) +/* analyse de la ligne de commande */ + for (passe = 0; passe < 2; passe++) + { + /* passe -1 : la plus prioritaire : redirection de stderr */ + /* passe 0 : rcfile overide ? */ + /* passe 1 : les affaire courantes */ + for (i = 1; i < nbcm; i++) + { + switch (cmde[i][0]) + { + case '-': + if (strncmp (cmde[i], "--h", 3) == 0) { - AnVoice *anv = &anvoice[i]; - - if (anv->reso.ampmode) - { -// anv->reso.amp = (anv->reso.amp * (0x8000 - anv->reso.ctdecay)) >> 15; - anv->reso.amp = (anv->reso.amp * (0x7FFC - anv->reso.ctdecay)) >> 15; - } - else - { - anv->reso.amp += 0x1 + anv->reso.amp; - if (anv->reso.amp > 0x10000) /* we switch to decay mode */ - { - anv->reso.amp = 0x10000; - anv->reso.ampmode = 1; - } - } -#ifdef RELATFREQ - anv->reso.freq = 10 + tabfreq[anv->freqbase2 + anv->reso.ctfreqcut2] + (((tabfreq[anv->freqbase2 + anv->reso.ctfreqcut] - tabfreq[anv->freqbase2 + anv->reso.ctfreqcut2]) * anv->reso.amp) >> 16); -#else - anv->reso.freq = 10 + tabfreq[anv->reso.ctfreqcut2] + (((tabfreq[anv->reso.ctfreqcut] - tabfreq[anv->reso.ctfreqcut2]) * anv->reso.amp) >> 16); -#endif + usage = 1; } - for (i = 0; i < MAXDYFILT; i++) + else if (strncmp (cmde[i], "-h", 2) == 0) { - DyFilter *fil = &dyfilter[i]; - - if (fil->reso.ampmode) + usage = 1; + } + else if (strncmp (cmde[i], "-noX", 4) == 0) + { + if (passe == 1) + noX = 1; + } + else if (strncmp (cmde[i], "-err", 4) == 0) + { + if (passe == 0) + freopen (cmde[i] + 4, "a", stderr); + } + else if (strncmp (cmde[i], "-rc", 3) == 0) + { + if (passe == 0) + rcfile = cmde[i + 1]; + i++; + } + else if (strncmp (cmde[i], "-raw", 4) == 0) + { + if (passe == 1) { - fil->reso.amp = (fil->reso.amp * (0x7FFC - fil->reso.ctdecay)) >> 15; + strcpy (nfoutbis, cmde[i + 1]); + foutbis = genrawname (nfoutbis, &numoutbis); + if (foutbis == NULL) + rawing2disk = BUT_DIS; + else + rawing2disk = BUT_OFF; } - else + i++; + } + else if (strncmp (cmde[i], "-fakedsp", 8) == 0) + { + if (passe == 1) + forcedfakedsp = 1; + } + else if (strncmp (cmde[i], "-fixedpos", 9) == 0) + { + if (passe == 1) + fixedpos = cmde[i + 1]; + i++; + } + else if (passe == 1) + fprintf (stderr, "unrecognised option %s\n", cmde[i]); + break; + default: + if (passe == 1) + { + letsreadfile++; + if (isreallyafile (cmde[i]) == 0) { - fil->reso.amp += 0x1 + fil->reso.amp; - if (fil->reso.amp > 0x10000) /* we switch to decay mode */ - { - fil->reso.amp = 0x10000; - fil->reso.ampmode = 1; - } + if (nftobeload == NULL) + fprintf (stderr, "let's load %s to start...\n", cmde[i]); + else + fprintf (stderr, "no finally, i'll load %s instead of %s\n", cmde[i], nftobeload); + nftobeload = cmde[i]; } - fil->reso.freq = 10 + tabfreq[fil->reso.ctfreqcut2] + (((tabfreq[fil->reso.ctfreqcut] - tabfreq[fil->reso.ctfreqcut2]) * fil->reso.amp) >> 16); } - } - - voice = 0; - voice = generation_pattern (&l, &r, voice); /* JDJDJD inliner plus tard */ - voice = generation_analogik (&l, &r, voice); /* JDJDJD inliner plus tard */ - voice = generation_dyfilter (&l, &r, voice); /* JDJDJD inliner plus tard */ - voice = generation_delay (&l, &r, voice); /* JDJDJD inliner plus tard */ - voice = generation_deriv (&l, &r, voice); /* JDJDJD inliner plus tard */ - -/* ------------ ecretage, pasteurisation et camembert ------------------------------ */ + } + } + if (passe == 0) + { + if (init_grov_io (rcsid)) + exit (-1); + reset_settings (rcfile); + } + } - if (l < -32766) - l = -32766; - else if (l > 32767) - l = 32767; - if (r < -32766) - r = -32766; - else if (r > 32767) - r = 32767; - if (usejack) { - *jackoutl ++ = ((jack_default_audio_sample_t) l)/32768.0; - *jackoutr ++ = ((jack_default_audio_sample_t) r)/32768.0; - absl = iabs ((short) l); - absr = iabs ((short) r); - totleft += absl; - totright += absr; - if (absl > maxleft) - maxleft = absl; - if (absr > maxright) - maxright = absr; - } else { -#ifdef HOPEDMONO16 - absl = iabs ((short) l); - absr = iabs ((short) r); - *pbuf++ = ((l + r) >> 1); +#ifndef CCUNAMED +#error possibly incorrect use of Makefile #endif - -#ifdef HOPEDRESO16 - absl = iabs ((short) (*pbuf++ = l)); -#endif -#ifdef HOPEDRESO8 - absl = iabs ((short) l); - *pbuf++ = (l >> 8) ^ 0x80; -#endif - -#ifdef HOPEDRESO16 - absr = iabs ((short) (*pbuf++ = r)); -#endif -#ifdef HOPEDRESO8 - absr = iabs ((short) r); - *pbuf++ = (r >> 8) ^ 0x80; -#endif - - totleft += absl; - totright += absr; - if (absl > maxleft) - maxleft = absl; - if (absr > maxright) - maxright = absr; - } /* else if usejack ....*/ - } - - if (!usejack) { -#ifdef NEVERINTER /* JDJDJDJD a enlever car c'est du debug... */ -#ifdef ALARMHANDLER /* stopping the timer */ - if (usetimer) - { - setitimer (ITIMER_REAL, &stoptime, NULL); - signal_alrm.sa_flags = SA_NODEFER; - signal_alrm.sa_handler = catchALRM; - sigemptyset (&signal_alrm.sa_mask); - sigaction (SIGALRM, &signal_alrm, NULL); - } -#endif -#endif -#ifdef SLICEDOUT /* on ecrit par petits morceaux car en 2.2.x les gros writes */ - /* ne passent plus avec un timer en usage */ - { - long l; - - for (l = 0; l < sizebufahead; l += SLICEDOUT) - { -#ifdef NEVERINTER /* JDJDJDJD a enlever car c'est du debug... */ -#ifdef ALARMHANDLER /* stopping the timer */ -/* alors la c'est le ponpon !!! */ - pollmouse (); -#endif -#endif - while (write (fdsp, l + (char *) &reserve[0][0], SLICEDOUT) != SLICEDOUT) - { - switch (errno) - { - case EINTR: - continue; - default: - nbconterr += 2; -/* fprintf (stderr, "write: offset %ld errno %d %s\n", l, errno, strerror(errno)); */ - fprintf (stderr, "write: offset %ld (tot:%ld) errno %d %s\n", l, sizebufahead, errno, strerror (errno)); - if (nbconterr > MAXERRTOLERATE) - { - fprintf (stderr, "too much spooled errors...\n"); - fdsp = enterfakedsp (fdsp); - nbconterr = 0; - } - } - break; - } - if (nbconterr > 0) - nbconterr--; - } - } -#else - while (write (fdsp, &reserve[0][0], sizebufahead) != sizebufahead) - { - switch (errno) - { - case EINTR: - continue; - default: - nbconterr += 2; - fprintf (stderr, "write: offset %ld errno %d %s\n", (long) l, errno, strerror (errno)); -/* pdebug (errno, strerror(errno)); */ - if (nbconterr > MAXERRTOLERATE) - { - fprintf (stderr, "too much spooled errors...\n"); - fdsp = enterfakedsp (fdsp); - } - } - break; - } - if (nbconterr > 0) - nbconterr--; -#endif -#ifdef NEVERINTER /* JDJDJDJD a enlever car c'est du debug... */ -#ifdef ALARMHANDLER - if (usetimer) - { - polltime.it_interval.tv_sec = 0; - polltime.it_interval.tv_usec = STDPOLLTIME; - setitimer (ITIMER_REAL, &polltime, NULL); - signal_alrm.sa_flags = SA_NODEFER; - signal_alrm.sa_handler = catchALRM; - sigemptyset (&signal_alrm.sa_mask); - sigaction (SIGALRM, &signal_alrm, NULL); - } -#endif -#endif - if (myrawingtodisk) - { - while (fwrite (&reserve[0][0], sizebufahead, 1, foutbis) != 1) - { - switch (errno) - { - case EINTR: - continue; - case ENOSPC: - closewaveout (foutbis); - foutbis = NULL; - fprintf (stderr, "close the raw to disk because no more space left\n"); - default: - pdebug (errno, strerror (errno)); - } - break; - } - if ((rawing2disk != BUT_ON) && (foutbis != NULL)) - { - myrawingtodisk = 0; - closewaveout (foutbis); - foutbis = genrawname (nfoutbis, &numoutbis); - if (foutbis == NULL) - rawing2disk = BUT_DIS; - else - rawing2disk = BUT_OFF; - refreshcontrols (hrawing2disk); - } - } - } /* if not usejack */ - - /* affichage de la diode de pattern */ -#ifdef DIODEINPAT - allumediode (tp); -#endif - - /* affichage level output */ - - totleft = (totleft / playahead) >> 11; - totleft = totleft > 15 ? 16 : totleft; - totright = (totright / playahead) >> 11; - totright = totright > 15 ? 16 : totright; - maxleft >>= 11; - maxleft = maxleft > 15 ? 16 : maxleft; - maxright >>= 11; - maxright = maxright > 15 ? 16 : maxright; - - printf ("%s", ramppos3); - rampe (totleft,totright); - printf ("%s", ramppos4); - rampe (maxleft,maxright); -/* printf ("%s%s", ramppos1, barlevel[totleft]); - printf ("%s%s", ramppos2, barlevel[totright]); - printf ("%s%s", ramppos3, barlevel[maxleft]); - printf ("%s%s", ramppos4, barlevel[maxright]); -*/ - } -/********************* polling *********************************/ - - scrflush (); - -#ifdef HANDLE_JOY - if ((fjs1 != -1) && (fjs2 != -1)) - { /* on fait 4 mesures pour chaques histoire de faire une - moyenne */ - int x1 = 0, y1 = 0, n1 = 0, x2 = 0, y2 = 0 , n2 = 0; - - if (read (fjs1, &js, JS_RETURN) == JS_RETURN) - x1 += js.x, y1 += js.y, n1++; - if (read (fjs2, &js, JS_RETURN) == JS_RETURN) - x2 += js.x, y2 += js.y, n2++; - if (read (fjs1, &js, JS_RETURN) == JS_RETURN) - x1 += js.x, y1 += js.y, n1++; - if (read (fjs2, &js, JS_RETURN) == JS_RETURN) - x2 += js.x, y2 += js.y, n2++; - if (read (fjs1, &js, JS_RETURN) == JS_RETURN) - x1 += js.x, y1 += js.y, n1++; - if (read (fjs2, &js, JS_RETURN) == JS_RETURN) - x2 += js.x, y2 += js.y, n2++; - if (read (fjs1, &js, JS_RETURN) == JS_RETURN) - x1 += js.x, y1 += js.y, n1++; - if (read (fjs2, &js, JS_RETURN) == JS_RETURN) - x2 += js.x, y2 += js.y, n2++; - - /* JDJDJDJD */ - /* ces affectations sont pour le moins arbitraires... */ - if (n1 == 4) { - dyfilter[0].reso.ctfreqcut = (256 * (x1 - 80)) / 1950; - dyfilter[0].reso.ctfreqcut2 = (256 * (y1 - 80)) / 1950; - } - if (n2 == 4) { - dyfilter[0].reso.ctreso = (256 * (y2 - 80)) / 1950; - dyfilter[0].reso.ctdecay = (256 * (x2 - 80)) / 1950; - } - } -#endif - - lastpressed = pollcontrols (isplayin == BUT_ON ? minipolltime : LONGPOLLTIME); - if (allpower == BUT_OFF) - { if (usejack) - leavenow = 1; - else - return 1; /* when it was inside a loop, it was : break; */ - } - - /* because of its immediate action on outputs, it is kept here */ - if ((rawing2disk != BUT_OFF) && (foutbis != NULL)) - myrawingtodisk = 1; - - if (opendsp != isopendsp) - { - switch (opendsp) - { - case BUT_OFF: // on doit fermer le dsp - fdsp = enterfakedsp (fdsp); - nbconterr = 0; - isopendsp = opendsp; - refreshcontrols (hopendsp); - break; - - case BUT_ON: // on doit ouvrir le dsp - fdsp = leavefakedsp (fdsp); - if (fdsp == -1) - { - fdsp = enterfakedsp (fdsp); - opendsp = BUT_OFF; - } - isopendsp = opendsp; - refreshcontrols (hopendsp); - break; - - default: - fprintf (stderr, "warning: internal error for treating \"opendsp\", continuing anyway\n"); - isopendsp = opendsp; - } - } - } - return 0; -} - -int main (int nbcm, char **cmde) -{ -#ifdef RINGMODULATOR -/* RING MODULATOR TEST */ - int lring = 1, rring = 1; - -#endif - - int forcedfakedsp = 0, /* mode fakedsp force */ - passe, /* compteur de passe pour la ligne de commande */ - i; /* compteur a tout faire */ - - int noX = 0, /* on ne veut pas forker de X */ - usage = 0, /* afficher l'usage */ - letsreadfile = 0; /* on nous demande de lire un fichier */ - - - char *fixedpos = NULL; /* coordonnees de la fenetre en position fixee */ - char *nftobeload = NULL; /* le fichier a lire au demarrage */ - char *rcfile = NULL; /* le rcfile en cours (null=default) */ - -#ifdef DDD_DEBUG - fprintf (stderr, "debugging with ddd my PID is %d !\n", getpid ()); - getchar (); -#endif - - /* JDJDJDJD il faudrait enlever ca au plus vite ... */ - rustine (); - nfoutbis[0] = 0; - -/* analyse de la ligne de commande */ - for (passe = 0; passe < 2; passe++) - { - /* passe -1 : la plus prioritaire : redirection de stderr */ - /* passe 0 : rcfile overide ? */ - /* passe 1 : les affaire courantes */ - for (i = 1; i < nbcm; i++) - { - switch (cmde[i][0]) - { - case '-': - if (strncmp (cmde[i], "--h", 3) == 0) - { - usage = 1; - } - else if (strncmp (cmde[i], "-h", 2) == 0) - { - usage = 1; - } - else if (strncmp (cmde[i], "-noX", 4) == 0) - { - if (passe == 1) - noX = 1; - } - else if (strncmp (cmde[i], "-err", 4) == 0) - { - if (passe == 0) { - if (freopen (cmde[i] + 4, "a", stderr) == NULL) { - int e = errno; - fprintf (stderr, "could not open %s : %s\n", cmde[i] + 4, strerror(e)); - } - } - } - else if (strncmp (cmde[i], "-rc", 3) == 0) - { - if (passe == 0) - rcfile = cmde[i + 1]; - i++; - } - else if (strncmp (cmde[i], "-raw", 4) == 0) - { - if (passe == 1) - { - strcpy (nfoutbis, cmde[i + 1]); - foutbis = genrawname (nfoutbis, &numoutbis); - if (foutbis == NULL) - rawing2disk = BUT_DIS; - else - rawing2disk = BUT_OFF; - } - i++; - } - else if (strncmp (cmde[i], "-jack", 5) == 0) - { - usejack = 1; - if (cmde[i][5] == '=') { - if (strlen (cmde[i]+6) == 0) { - fprintf (stderr, "error : \"-jack=name\" needs a name\n"); - exit (1); - } else { - instancename = cmde[i]+6; - } - } - } - else if (strncmp (cmde[i], "-fakedsp", 8) == 0) - { - if (passe == 1) - forcedfakedsp = 1; - } - else if (strncmp (cmde[i], "-fixedpos", 9) == 0) - { - if (passe == 1) - fixedpos = cmde[i + 1]; - i++; - } - else if (passe == 1) - fprintf (stderr, "unrecognised option %s\n", cmde[i]); - break; - default: - if (passe == 1) - { - letsreadfile++; - if (isreallyafile (cmde[i]) == 0) - { - if (nftobeload == NULL) - fprintf (stderr, "let's load %s to start...\n", cmde[i]); - else - fprintf (stderr, "no finally, i'll load %s instead of %s\n", cmde[i], nftobeload); - nftobeload = cmde[i]; - } - } - } - } - if (passe == 0) - { - if (init_grov_io (rcsid)) - exit (-1); - reset_settings (rcfile); - } - } - -#ifndef CCUNAMED -#error possibly incorrect use of Makefile -#endif - fprintf (stderr, "%s\n", rcsid); - fprintf (stderr, "configured on %s by %s\n", UNAMED, CONFEDBY); - fprintf (stderr, " compiled on %s by %s\n", CCUNAMED, CCCONFEDBY); - if (usage) - { - showusage (); - exit (0); - } - if (letsreadfile && (nftobeload == NULL)) - { - fprintf (stderr, "none of the %d files could be read, quiting.\n", letsreadfile); - exit (-1); - } + fprintf (stderr, "%s\n", rcsid); + fprintf (stderr, "configured on %s by %s\n", UNAMED, CONFEDBY); + fprintf (stderr, " compiled on %s by %s\n", CCUNAMED, CCCONFEDBY); + if (usage) + { + showusage (); + exit (0); + } + if (letsreadfile && (nftobeload == NULL)) + { + fprintf (stderr, "none of the %d files could be read, quiting.\n", letsreadfile); + exit (-1); + } /* on teste une premiere fois le dsp */ if (!forcedfakedsp) { - if (usejack) { - if ((client = jack_client_new (instancename)) == NULL) { - fprintf (stderr, "could not connect to jackd server\n"); - } - jack_client_close (client); - client = NULL; - } else { - fdsp = initoutdsp (); - if (fdsp == -1) - { - exit (1); - } - resetdsp (fdsp); + fdsp = initoutdsp (); + if (fdsp == -1) + { + exit (1); } + resetdsp (fdsp); } if ((getenv ("DISPLAY") != NULL) && !noX) @@ -1411,8 +920,7 @@ int main (int nbcm, char **cmde) } argv[argc++] = cmde[0]; argv[argc++] = "-noX"; - if (morearg != NULL) - argv[argc++] = morearg; + argv[argc++] = morearg; for (i = 1; i < nbcm; i++) argv[argc++] = cmde[i]; argv[argc++] = NULL; @@ -1433,12 +941,8 @@ int main (int nbcm, char **cmde) fprintf (stderr, "warning: allocation problems ???\n"); else strcpy (a, ttyname (1)); - if (strcmp (a, ttyname (2)) == 0) { - if (freopen ("/dev/null", "a", stderr) == NULL) { - int e = errno; - fprintf (stderr, "could not open %s : %s\n", "/dev/null", strerror(e)); - } - } + if (strcmp (a, ttyname (2)) == 0) + freopen ("/dev/null", "a", stderr); free (a); } } @@ -1471,7 +975,6 @@ int main (int nbcm, char **cmde) #endif /* on met a jour les niveaux de sortie */ - switch (initmixer ()) { case -1: @@ -1484,7 +987,6 @@ int main (int nbcm, char **cmde) ; } - /* initialisation du lock des pages en memoire */ /* JDJDJD pourrait eventuellement etre affine ??? */ /* devrait etre liberer des que l'on ne joue pas */ @@ -1514,12 +1016,12 @@ int main (int nbcm, char **cmde) case 0: break; case -2: /* on ecrit stdout ET stderr au cas stderr=/dev/null */ - fprintf (stderr, "%s", err1); - fprintf (stdout, "%s", err1); + fprintf (stderr, err1); + fprintf (stdout, err1); exit (1); default: - fprintf (stderr, "%s", err2); - fprintf (stdout, "%s", err2); + fprintf (stderr, err2); + fprintf (stdout, err2); exit (1); } } @@ -1555,123 +1057,448 @@ int main (int nbcm, char **cmde) /* JDJDJDJD come sanity jobs needed here !!! */ strcpy (cursongfile, "no-title"); shortcursongfile = cursongfile; - settitle (instancename, shortcursongfile); + settitle (gname, shortcursongfile); + } +#endif + else + { + wasmodified = 0; + strcpy (cursongfile, nftobeload); + shortcursongfile = strrchr (cursongfile, '/'); + if (shortcursongfile == NULL) + shortcursongfile = cursongfile; + else + shortcursongfile++; + settitle (gname, shortcursongfile); + } + } + + if (forcedfakedsp) + { + fdsp = enterfakedsp (-1); + } + else + { + fdsp = initoutdsp (); + if (fdsp == -1) + { + resetcontrols (); + exit (1); } + } + nbconterr = 0; + + settitle (gname, shortcursongfile); + init_mixeur (); + initboard (rcsid); + resync_displaypatterns (); + + initgrsel (); + initdialogs (); + initmenu (); + initsettings (); + + /* JDJDJDJD this is probably not needed... */ + for (i = 0; i < MAXSAMPLE; i++) + cursamp[i] = 0; + + if (fdsp == -1) /* we set the button according to the mode */ + opendsp = BUT_OFF; + else + opendsp = BUT_ON; + isopendsp = opendsp; + + pollcontrols (0); /* to force a first redraw... */ + + if (!gpl_accepted) + alert_gpl (); + +/*---------------------------------------------------------------------*/ +/* boucle principale - main loop */ + +#ifdef ALARMHANDLER + if (usetimer) + { + polltime.it_interval.tv_sec = 0; + polltime.it_interval.tv_usec = STDPOLLTIME; + setitimer (ITIMER_REAL, &polltime, NULL); + signal_alrm.sa_flags = SA_NODEFER; + signal_alrm.sa_handler = catchALRM; + sigemptyset (&signal_alrm.sa_mask); + sigaction (SIGALRM, &signal_alrm, NULL); + } +#endif + + if ((kplayahead < 0) || (kplayahead > (MAXPLAYAHEAD >> 10))) + kplayahead = (MAXPLAYAHEAD >> 10); + + playahead = (kplayahead << 10); +#ifdef HOPEDRESO16 + sizebufahead = (playahead << 2); +#endif +#ifdef HOPEDRESO8 + sizebufahead = (playahead << 1); +#endif +#ifdef HOPEDMONO16 + sizebufahead = (playahead << 1); +#endif + + for (ts = 0; 1; ts += playahead) + { +#ifdef HOPEDMONO16 + pbuf = (unsigned short *) &reserve[0][0]; +#endif +#ifdef HOPEDRESO16 + pbuf = (unsigned short *) &reserve[0][0]; +#endif +#ifdef HOPEDRESO8 + pbuf = (unsigned char *) &reserve[0][0]; +#endif + totleft = 0; + totright = 0; + maxleft = 0; + maxright = 0; + if (isplayin == BUT_ON) + { + for (tss = ts, endtss = playahead; endtss; endtss--, tss++, nss--) + { + if (!nss) /* la on passe d'un tick a l'autre */ + { +/* JDJDJDJD l'avenir dira si cette methode est bone... */ + if (isreplaying) tickchange_play (); + + voice = 0; + + lnss = UNJBPM / bpm; + nss = lnss; +/* later (in a few) thoses functions would have been registered */ + voice = tickchange_pattern (voice); + voice = tickchange_analogik (voice); + voice = tickchange_dyfilter (voice); + voice = tickchange_delay (voice); + + t++; + } + +/* mise a zero des cumuls generaux */ + l = 0; + r = 0; + +/* ----------controles des amplitudes + (envellopes)-------------------------------------------- */ +/* JDJDJDJD remplacer par un generateur d'envellopes */ + + if ((tss & AMPTESTMASK) == 0) + { + for (i = 0; i < MAXANALOG; i++) + { + AnVoice *anv = &anvoice[i]; + + if (anv->reso.ampmode) + { +// anv->reso.amp = (anv->reso.amp * (0x8000 - anv->reso.ctdecay)) >> 15; + anv->reso.amp = (anv->reso.amp * (0x7FFC - anv->reso.ctdecay)) >> 15; + } + else + { + anv->reso.amp += 0x1 + anv->reso.amp; + if (anv->reso.amp > 0x10000) /* we switch to decay mode */ + { + anv->reso.amp = 0x10000; + anv->reso.ampmode = 1; + } + } +#ifdef RELATFREQ + anv->reso.freq = 10 + tabfreq[anv->freqbase2 + anv->reso.ctfreqcut2] + (((tabfreq[anv->freqbase2 + anv->reso.ctfreqcut] - tabfreq[anv->freqbase2 + anv->reso.ctfreqcut2]) * anv->reso.amp) >> 16); +#else + anv->reso.freq = 10 + tabfreq[anv->reso.ctfreqcut2] + (((tabfreq[anv->reso.ctfreqcut] - tabfreq[anv->reso.ctfreqcut2]) * anv->reso.amp) >> 16); +#endif + } + for (i = 0; i < MAXDYFILT; i++) + { + DyFilter *fil = &dyfilter[i]; + + if (fil->reso.ampmode) + { + fil->reso.amp = (fil->reso.amp * (0x7FFC - fil->reso.ctdecay)) >> 15; + } + else + { + fil->reso.amp += 0x1 + fil->reso.amp; + if (fil->reso.amp > 0x10000) /* we switch to decay mode */ + { + fil->reso.amp = 0x10000; + fil->reso.ampmode = 1; + } + } + fil->reso.freq = 10 + tabfreq[fil->reso.ctfreqcut2] + (((tabfreq[fil->reso.ctfreqcut] - tabfreq[fil->reso.ctfreqcut2]) * fil->reso.amp) >> 16); + } + } + + voice = 0; + voice = generation_pattern (&l, &r, voice); /* JDJDJD inliner plus tard */ + voice = generation_analogik (&l, &r, voice); /* JDJDJD inliner plus tard */ + voice = generation_dyfilter (&l, &r, voice); /* JDJDJD inliner plus tard */ + voice = generation_delay (&l, &r, voice); /* JDJDJD inliner plus tard */ + voice = generation_deriv (&l, &r, voice); /* JDJDJD inliner plus tard */ + +/* ------------ ecretage, pasteurisation et camembert ------------------------------ */ + + if (l < -32766) + l = -32766; + else if (l > 32767) + l = 32767; + if (r < -32766) + r = -32766; + else if (r > 32767) + r = 32767; +#ifdef HOPEDMONO16 + absl = iabs ((short) l); + absr = iabs ((short) r); + *pbuf++ = ((l + r) >> 1); +#endif + +#ifdef HOPEDRESO16 + absl = iabs ((short) (*pbuf++ = l)); +#endif +#ifdef HOPEDRESO8 + absl = iabs ((short) l); + *pbuf++ = (l >> 8) ^ 0x80; #endif - else - { - wasmodified = 0; - strcpy (cursongfile, nftobeload); - shortcursongfile = strrchr (cursongfile, '/'); - if (shortcursongfile == NULL) - shortcursongfile = cursongfile; - else - shortcursongfile++; - settitle (instancename, shortcursongfile); - } - } - if (forcedfakedsp) - { - fdsp = enterfakedsp (-1); - } - else - { - if (usejack) { - if ((client = jack_client_new (instancename)) == NULL) { - fprintf (stderr, "could not connect to jackd server\n"); - } - if (client != NULL) { - jack_set_process_callback (client, mainloop, 0); - jack_on_shutdown (client, jack_shutdown, 0); +#ifdef HOPEDRESO16 + absr = iabs ((short) (*pbuf++ = r)); +#endif +#ifdef HOPEDRESO8 + absr = iabs ((short) r); + *pbuf++ = (r >> 8) ^ 0x80; +#endif - fprintf (stderr, "engine sample rate: %" PRIu32 "\n", jack_get_sample_rate (client)); + totleft += absl; + totright += absr; + if (absl > maxleft) + maxleft = absl; + if (absr > maxright) + maxright = absr; + } - output_portl = jack_port_register (client, "outputl", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); - output_portr = jack_port_register (client, "outputr", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); +#ifdef NEVERINTER /* JDJDJDJD a enlever car c'est du debug... */ +#ifdef ALARMHANDLER /* stopping the timer */ + if (usetimer) + { + setitimer (ITIMER_REAL, &stoptime, NULL); + signal_alrm.sa_flags = SA_NODEFER; + signal_alrm.sa_handler = catchALRM; + sigemptyset (&signal_alrm.sa_mask); + sigaction (SIGALRM, &signal_alrm, NULL); + } +#endif +#endif +#ifdef SLICEDOUT /* on ecrit par petits morceaux car en 2.2.x les gros writes */ + /* ne passent plus avec un timer en usage */ + { + long l; - midi_input = jack_port_register (client, "midi_input", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); + for (l = 0; l < sizebufahead; l += SLICEDOUT) + { +#ifdef NEVERINTER /* JDJDJDJD a enlever car c'est du debug... */ +#ifdef ALARMHANDLER /* stopping the timer */ +/* alors la c'est le ponpon !!! */ + pollmouse (); +#endif +#endif + while (write (fdsp, l + (char *) &reserve[0][0], SLICEDOUT) != SLICEDOUT) + { + switch (errno) + { + case EINTR: + continue; + default: + nbconterr += 2; +/* fprintf (stderr, "write: offset %ld errno %d %s\n", l, errno, strerror(errno)); */ + fprintf (stderr, "write: offset %ld (tot:%ld) errno %d %s\n", l, sizebufahead, errno, strerror (errno)); + if (nbconterr > MAXERRTOLERATE) + { + fprintf (stderr, "too much spooled errors...\n"); + fdsp = enterfakedsp (fdsp); + nbconterr = 0; + } + } + break; + } + if (nbconterr > 0) + nbconterr--; + } } - } else { - fdsp = initoutdsp (); - if (fdsp == -1) +#else + while (write (fdsp, &reserve[0][0], sizebufahead) != sizebufahead) { - resetcontrols (); - exit (1); + switch (errno) + { + case EINTR: + continue; + default: + nbconterr += 2; + fprintf (stderr, "write: offset %ld errno %d %s\n", (long) l, errno, strerror (errno)); +/* pdebug (errno, strerror(errno)); */ + if (nbconterr > MAXERRTOLERATE) + { + fprintf (stderr, "too much spooled errors...\n"); + fdsp = enterfakedsp (fdsp); + } + } + break; + } + if (nbconterr > 0) + nbconterr--; +#endif +#ifdef NEVERINTER /* JDJDJDJD a enlever car c'est du debug... */ +#ifdef ALARMHANDLER + if (usetimer) + { + polltime.it_interval.tv_sec = 0; + polltime.it_interval.tv_usec = STDPOLLTIME; + setitimer (ITIMER_REAL, &polltime, NULL); + signal_alrm.sa_flags = SA_NODEFER; + signal_alrm.sa_handler = catchALRM; + sigemptyset (&signal_alrm.sa_mask); + sigaction (SIGALRM, &signal_alrm, NULL); + } +#endif +#endif + if (myrawingtodisk) + { + while (fwrite (&reserve[0][0], sizebufahead, 1, foutbis) != 1) + { + switch (errno) + { + case EINTR: + continue; + case ENOSPC: + closewaveout (foutbis); + foutbis = NULL; + fprintf (stderr, "close the raw to disk because no more space left\n"); + default: + pdebug (errno, strerror (errno)); + } + break; + } + if ((rawing2disk != BUT_ON) && (foutbis != NULL)) + { + myrawingtodisk = 0; + closewaveout (foutbis); + foutbis = genrawname (nfoutbis, &numoutbis); + if (foutbis == NULL) + rawing2disk = BUT_DIS; + else + rawing2disk = BUT_OFF; + refreshcontrols (hrawing2disk); + } } - } - } - nbconterr = 0; - - settitle (instancename, shortcursongfile); - init_mixeur (); - initboard (rcsid); - resync_displaypatterns (); - initgrsel (); - initdialogs (); - initmenu (); - initsettings (); + /* affichage de la diode de pattern */ +#ifdef DIODEINPAT + allumediode (tp); +#endif - /* JDJDJDJD this is probably not needed... */ - for (i = 0; i < MAXSAMPLE; i++) - cursamp[i] = 0; + /* affichage level output */ - if (fdsp == -1) /* we set the button according to the mode */ - opendsp = BUT_OFF; - else - opendsp = BUT_ON; - isopendsp = opendsp; + totleft = (totleft / playahead) >> 11; + totleft = totleft > 15 ? 16 : totleft; + totright = (totright / playahead) >> 11; + totright = totright > 15 ? 16 : totright; + maxleft >>= 11; + maxleft = maxleft > 15 ? 16 : maxleft; + maxright >>= 11; + maxright = maxright > 15 ? 16 : maxright; - pollcontrols (0); /* to force a first redraw... */ + printf ("%s", ramppos3); + rampe (totleft,totright); + printf ("%s", ramppos4); + rampe (maxleft,maxright); +/* printf ("%s%s", ramppos1, barlevel[totleft]); + printf ("%s%s", ramppos2, barlevel[totright]); + printf ("%s%s", ramppos3, barlevel[maxleft]); + printf ("%s%s", ramppos4, barlevel[maxright]); +*/ + } +/********************* polling *********************************/ - if (!gpl_accepted) - alert_gpl (); + scrflush (); -/*---------------------------------------------------------------------*/ -/* boucle principale - main loop */ +#ifdef HANDLE_JOY + if ((fjs1 != -1) && (fjs2 != -1)) + { /* on fait 4 mesures pour chaques histoire de faire une + moyenne */ + int x1 = 0, y1 = 0, x2 = 0, y2 = 0; + + read (fjs1, &js, JS_RETURN); + x1 += js.x; + y1 += js.y; + read (fjs2, &js, JS_RETURN); + x2 += js.x; + y2 += js.y; + read (fjs1, &js, JS_RETURN); + x1 += js.x; + y1 += js.y; + read (fjs2, &js, JS_RETURN); + x2 += js.x; + y2 += js.y; + read (fjs1, &js, JS_RETURN); + x1 += js.x; + y1 += js.y; + read (fjs2, &js, JS_RETURN); + x2 += js.x; + y2 += js.y; + read (fjs1, &js, JS_RETURN); + x1 += js.x; + y1 += js.y; + read (fjs2, &js, JS_RETURN); + x2 += js.x; + y2 += js.y; -#ifdef ALARMHANDLER - if (usetimer) - { - polltime.it_interval.tv_sec = 0; - polltime.it_interval.tv_usec = STDPOLLTIME; - setitimer (ITIMER_REAL, &polltime, NULL); - signal_alrm.sa_flags = SA_NODEFER; - signal_alrm.sa_handler = catchALRM; - sigemptyset (&signal_alrm.sa_mask); - sigaction (SIGALRM, &signal_alrm, NULL); - } + /* JDJDJDJD */ + /* ces affectations sont pour le moins arbitraires... */ + dyfilter[0].reso.ctfreqcut = (256 * (x1 - 80)) / 1950; + dyfilter[0].reso.ctfreqcut2 = (256 * (y1 - 80)) / 1950; + dyfilter[0].reso.ctreso = (256 * (y2 - 80)) / 1950; + dyfilter[0].reso.ctdecay = (256 * (x2 - 80)) / 1950; + } #endif - if ((kplayahead < 0) || (kplayahead > (MAXPLAYAHEAD >> 10))) - kplayahead = (MAXPLAYAHEAD >> 10); + lastpressed = pollcontrols (isplayin == BUT_ON ? minipolltime : LONGPOLLTIME); + if (allpower == BUT_OFF) + break; - playahead = (kplayahead << 10); -#ifdef HOPEDRESO16 - sizebufahead = (playahead << 2); -#endif -#ifdef HOPEDRESO8 - sizebufahead = (playahead << 1); -#endif -#ifdef HOPEDMONO16 - sizebufahead = (playahead << 1); -#endif + /* because of its immediate action on outputs, it is kept here */ + if ((rawing2disk != BUT_OFF) && (foutbis != NULL)) + myrawingtodisk = 1; - if (usejack) { - if (jack_activate (client)) { - fprintf (stderr, "cannot activate jack as client"); - } - } + if (opendsp != isopendsp) + { + switch (opendsp) + { + case BUT_OFF: // on doit fermer le dsp + fdsp = enterfakedsp (fdsp); + nbconterr = 0; + isopendsp = opendsp; + refreshcontrols (hopendsp); + break; + + case BUT_ON: // on doit ouvrir le dsp + fdsp = leavefakedsp (fdsp); + if (fdsp == -1) + { + fdsp = enterfakedsp (fdsp); + opendsp = BUT_OFF; + } + isopendsp = opendsp; + refreshcontrols (hopendsp); + break; - leavenow = 0; - { useconds_t usleeptime = 100 * 1000; - for (ts = 0; 1; ts += playahead) { - if (!usejack) { - if (mainloop (0, NULL)) break; - } else { - usleep (usleeptime); - if (leavenow) break; + default: + fprintf (stderr, "warning: internal error for treating \"opendsp\", continuing anyway\n"); + isopendsp = opendsp; } } } diff --git a/groovit.h b/groovit.h index 7814b82..b93881a 100644 --- a/groovit.h +++ b/groovit.h @@ -137,11 +137,10 @@ char *match_sound[] = {".wav", ".WAV", NULL}, /* de type groovit */ *match_grov[] = {".grov", ".grav", NULL}, /* main menu */ - *gname = "gr" "oo" "vit", - *instancename; + *gname = "gr" "oo" "vit"; #else -extern char *match_sound[], *match_wav[], *match_grov[], *fmenmain[], *gname, *instancename; +extern char *match_sound[], *match_wav[], *match_grov[], *fmenmain[], *gname; #endif diff --git a/grpattern.c b/grpattern.c index 29f1744..5b32d43 100644 --- a/grpattern.c +++ b/grpattern.c @@ -211,9 +211,9 @@ void reset_pattern (void) freesample (&sample[i]); relooksimplebutton (hbt_sample[i], '@', CONTBLACK + CONTNOPUCE, sample[i].shortname); vlevel[i] = 0; -// /* trick again ... */ if (i) -// vpan[i] = 0xFF & (int) ((255.0 * i) / ((nb > MAXSAMPLE) ? MAXSAMPLE : nb)); -// else +/* trick again ... */ if (i) + vpan[i] = 0xFF & (int) ((255.0 * i) / ((nb > MAXSAMPLE) ? MAXSAMPLE : nb)); + else vpan[i] = 127; sample[i].revlevel = 0; sample[i].filtl = 0; diff --git a/grsequence.c b/grsequence.c index 8f95cbc..c39415d 100644 --- a/grsequence.c +++ b/grsequence.c @@ -130,18 +130,10 @@ void initPatbut (Patbut *pat, int ncurpattern, int tp, int curnbrow) pat->radiobank.value = ncurpattern >> 3; } -void refresh (Radio *r) { - int i; - for (i=0 ; inb ;i++) - refreshcontrols (r->h[i]); -} - void refrsyncPatbut (Patbut *pat, int nncurpattern) { pat->nncurpattern = nncurpattern; pat->radiopattern.value = nncurpattern & 0x7; pat->radiobank.value = nncurpattern >> 3; - refresh (&pat->radiopattern); - refresh (&pat->radiopattern); } int createpatbut (Patbut *pat, int voice, int pos, int evtype) @@ -239,7 +231,7 @@ void tickchange_play (void) int start_playing (void) { -// int i; + int i; #ifdef DEBSEQU fprintf (stderr, "-->start_playing\n"); diff --git a/menu_board.c b/menu_board.c index e65529a..d1583fc 100644 --- a/menu_board.c +++ b/menu_board.c @@ -373,12 +373,12 @@ void init_volumeandbalance (void) int l; if ((l = register_levels_as (0, " output ", &vlevel[0])) != 0) - { fprintf (stderr, "%s", surprise); + { fprintf (stderr, surprise); l = register_levels (" output ", &vlevel[0]); } show_levels (0, l); if ((l = register_levels_as (1, " pan ", &vpan[0])) != 1) - { fprintf (stderr, "%s", surprise); + { fprintf (stderr, surprise); l = register_levels (" pan ", &vpan[0]); } show_levels (1, l); diff --git a/readsample.c b/readsample.c index 8884e72..04a07a0 100644 --- a/readsample.c +++ b/readsample.c @@ -442,7 +442,7 @@ short *readsample_wav (char *nomfile, Sample *sample) buf[1] >= 32 ? buf[1] : '?', buf[2] >= 32 ? buf[2] : '?', buf[3] >= 32 ? buf[3] : '?', - (long unsigned int) *(Sint32 *) buf, + *(Sint32 *) buf, taille); skipped = 1; } diff --git a/settings.c b/settings.c index 8663a86..1ff036c 100644 --- a/settings.c +++ b/settings.c @@ -396,7 +396,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) { case SETT_WRITEALL: case SETT_WRITEMATCH: - fprintf (new, "%s", buf); + fprintf (new, buf); break; } continue; @@ -423,7 +423,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) { case SETT_WRITEALL: case SETT_WRITEMATCH: - fprintf (new, "%s", orig); + fprintf (new, orig); } continue; /* on passe a la ligne suivante */ } @@ -461,14 +461,14 @@ int scan_rcfile (char *rcfile, int mode, void **liste) case SETT_WRITEMATCH: if (match->checked == 0) { - fprintf (new, "%s", orig); + fprintf (new, orig); break; } case SETT_WRITEALL: if (vernumber > lv) fprintf (new, "%s:\t%s\n", buf, ltover (vernumber)); else - fprintf (new, "%s", orig); + fprintf (new, orig); break; case SETT_READMATCH: if (match->checked == 0) @@ -494,7 +494,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) case SETT_WRITEMATCH: if (match->checked == 0) { - fprintf (new, "%s", orig); + fprintf (new, orig); break; } case SETT_WRITEALL: @@ -502,7 +502,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) fprintf (new, "%s:\t%s\n", buf, (*(int *) match->v) ? "TRUE" : "FALSE"); else - fprintf (new, "%s", orig); + fprintf (new, orig); break; case SETT_READMATCH: if (match->checked == 0) @@ -520,7 +520,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) case SETT_WRITEMATCH: if (match->checked == 0) { - fprintf (new, "%s", orig); + fprintf (new, orig); break; } case SETT_WRITEALL: @@ -530,7 +530,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) } else { - fprintf (new, "%s", orig); + fprintf (new, orig); } break; case SETT_READMATCH: @@ -549,14 +549,14 @@ int scan_rcfile (char *rcfile, int mode, void **liste) case SETT_WRITEMATCH: if (match->checked == 0) { - fprintf (new, "%s", orig); + fprintf (new, orig); break; } case SETT_WRITEALL: if (*(long *) match->v != lv) fprintf (new, "%s:\t%ld\n", buf, *(long *) match->v); else - fprintf (new, "%s", orig); + fprintf (new, orig); break; case SETT_READMATCH: if (match->checked == 0) @@ -589,14 +589,14 @@ int scan_rcfile (char *rcfile, int mode, void **liste) case SETT_WRITEMATCH: if (match->checked == 0) { - fprintf (new, "%s", orig); + fprintf (new, orig); break; } case SETT_WRITEALL: if (strcmp ((char *) match->v, r) != 0) fprintf (new, "%s:\t%s\n", buf, (char *) match->v); else - fprintf (new, "%s", orig); + fprintf (new, orig); break; case SETT_READMATCH: if (match->checked == 0) @@ -613,7 +613,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) { case SETT_WRITEMATCH: case SETT_WRITEALL: - fprintf (new, "%s", orig); + fprintf (new, orig); } } match->checked = -1; @@ -649,7 +649,7 @@ int scan_rcfile (char *rcfile, int mode, void **liste) { case SETT_WRITEMATCH: case SETT_WRITEALL: - fprintf (new, "%s", orig); + fprintf (new, orig); } } i++;