Schreiben Sie die schönste Bytebeat-Komposition

24

Bytebeat ist ein Musikstil, den man komponieren kann, indem man ein einfaches C-Programm schreibt, dessen Ausgabe an aplayoder geleitet wird /dev/dsp.

main(t){for(;;t++)putchar(((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7);}

Auf der bytebeat-Site finden Sie zahlreiche Informationen , eine Javascript-Implementierung sowie weitere Demos und Beispielkompositionen in diesem Thread .

Sehr einfache Regeln: Versuchen Sie, eine hübsch klingende Komposition zu schreiben. Die meisten Stimmen gewinnen, da dies offensichtlich subjektiv ist, wenn auch nicht so subjektiv, wenn man die üblichen Ergebnisse berücksichtigt.

Jeff Burdges
quelle
Halten Sie dies für ein striktes Bytebeat (dh keine Puffer)?
Peter Taylor
4
Warum ist es auf C beschränkt?
Benutzer unbekannt
Es gibt keinen eigentlichen Grund, die Verwendung von Puffern oder anderen Sprachen einzuschränken, aber normalerweise bedeutet Bytebeat, dass eine bestimmte C-Schleife die durch eine Formel definierte Ausgabe enthält. Ich habe für Joey Adams gestimmt rand().
Jeff Burdges
Während ich diese Idee mag, fordert die FAQ ein objektives Gewinnkriterium (es ist zu einfach, sich in Berechnungen oder ASCII-Kunst zu verfangen). Können wir nach etwas besser definiertem als "hübsch" suchen?
dmckee

Antworten:

16

(Signierter 16-Bit-Little-Endian, 8000-Hz-Mono ( --format=S16_LE))

Musik

Viel besser als zuvor! (obwohl es ziemlich lang ist)

main(t){for(;;t++)putchar(((7&(((t>>17)+1)>>2)+((t>>10)&1+2*(t>>18&1))*(("23468643"[7&t>>12]-48)+(3&t>>11))+((3&t>>17)>0)*(3&t>>9)*!(1&t>>10)*(((2+t>>10&3)^(2+t>>11&3))))*t*"@06+"[3&t>>15]/32));}

(Sie können dies hier hören )

Ich habe das geschrieben, aber selbst ich weiß nicht, wie ein Teil funktioniert, wie >0und (besonders) der erste 7&.

Ändern Sie die for-Schleife auf for(;!(t>>22);t++)..., um sie "einmal" anzuhören. Ich weiß jedoch nicht, ob es genau so "schleift".

Melodie (Basis der obigen Musik)

Ich liebe diese Melodie, die ich gemacht habe (CGAF ftw), aber sie ist zu einfach ...

main(t){for(;;t++)putchar(((t>>10)&1)*(t*("23468643"[7&t>>12]-48)+t*(3&t>>11))*"@06+"[3&t>>15]/32);}

Einfache Musik (die ich vorher gemacht habe)

main(t){for(;;t++)putchar(t*(3&t>>11)+(t&t>>11)*4*!((t>>11)%3));}

JiminP
quelle
Wenn Sie auf den obigen Bytebeat-Link klicken, wird eine Sox-Befehlszeile zum Konvertieren in eine WAV-Datei und eine ungerade Compressor-Befehlszeile angezeigt.
Jeff Burdges
3
+1 Erstaunlich! Ein paar Bits (z. B. 1:30 - 1:40) klingen wie "Stottern", aber der eigentliche Charme des Bytes liegt in diesen merkwürdigen und unkonventionellen Rhythmen und Melodien, und der Gesamteffekt ist ausgezeichnet. (Ps. Ich habe das aus Versehen mit 8 Bit pro Sample gespielt, und das hört sich auch überraschend gut an. Es ist so, als würde man eine 45-U / min-Vinyl mit 33,3 U / min spielen.)
Ilmari Karonen
3

Die Linealfunktion in c-Moll:

#include <math.h>
#include <stdio.h>

#define PI 3.14159265358979323846

#define step(freq, n) ((freq) * pow(2, (n) / 12.0))
#define note(n)       step(440, n)
#define MIDDLE_C      note(-9)

int count_zeros(unsigned int n)
{
    int count = 0;
    for (; (n & 1) == 0; n >>= 1)
        count++;
    return count;
}

int minor_note(int note)
{
    int octave = note / 7;
    int scale[] = {0, 2, 3, 5, 7, 8, 10};

    note %= 7;
    if (note < 0) {
        note += 7;
        octave--;
    }

    return scale[note] + octave*12;
}

int main(void) {
    double t = 0.0;
    double freq = MIDDLE_C * 2;
    double step = PI * 2 / 8192;
    int n = 0;
    int i = 0;

    for (i = 1;; t += step, i++) {
        if (i == 1024) {
            i = 0;
            n++;
            freq = step(MIDDLE_C, minor_note(count_zeros(n)));
        }

        putchar(sin(t * freq) * 50.0 + 128.0);
    }

    return 0;
}
Joey Adams
quelle
Schöne Melodie, aber um eine "Komposition" zu sein, braucht diese IMO etwas mehr ...
Ilmari Karonen
3
main(t){for(;;t+=(t%6)?1:2)putchar((((t<<t^(t>>8))|(t<<7))*((t<<t&(t>>12))|(t<<10))));}
Pubby
quelle
Sehr klassischer Bytebeat, wenn das kein Oxymoron ist. +1 von mir.
Ilmari Karonen
3

Betonung "Beat" über "Byte":

#include<math.h>

double s(double,double);double r(double,double);double d(double);double f(double);

char bytebeat(int t){return (d(f(t/4000.)/3) + 1) * 63;}
double f(double t){
  double sn=s(1./2,t-1); sn*=(sn*sn);
  return 3*s(1./4,1/s(1,t))+3*s(4,1/sn)/2+s(4,1/(sn*sn*sn*sn*sn))/4
       +2*s(55+18.3*r(1./2,t),t)+s(110+s(5,t)/4000,t)*s(1,t)+s(220+110*r(1,t)+55*r(3,t),t)/5
       +s(880+440*r(1./2,t)-220*r(1,t)+110*r(2,t)+s(5,t)/4000,t)
       *(2+s(1760+438*r(3./2,t)-1234*r(2,t)+423*r(5,t),t))/9
       +s(s(1,t)+s(1./2,t)+s(1./4,t)+s(1./8,t),t)*s(s(1,t)+s(1./2,t)+s(1./4,t)+s(1./8,t)+1,t)
       +r(264+11*r(1./20,t),t)*s(1./20,t);
}
double s(double f,double t){return d(sin(f*3.14159265*(t+999)));}
double r(double f,double t){return s(f,t)<0;}
double d(double a){return tanh(a+a*a/4);}

main(t){for(;;++t)putchar(bytebeat(t));}

Verwendung bei 8 kHz, Uint8 Mono. Klingt am besten über anständig bassfähige Lautsprecher.

hörte auf, sich gegen den Uhrzeigersinn zu drehen
quelle
2
main(){for(;;)putchar(rand());}

Klingt nach Meer ;-)

Joey Adams
quelle
1
Eher wie ein sehr belebter Bahnübergang für mich. :)
Ilmari Karonen
5
Protip: Wenn es sich wie ein Dauerton anhört, ist Ihr RNG kaputt.
Mr. Llama
3
Einfacher Weg:$ cat /dev/urandom | aplay
Braden Best
2
@ B1KMusic viel einfacher:aplay /dev/urandom
Minmaxavg
0

Melodie und Harmonie kombiniert:

r=3,
r=3,
m=(t*(t>>12|t>>13|t>>14|t>>15|t>>16|t>>17|t>>18))&63,

h= ((t&t>>7&t>>6)|t*5&t>>8-c^t*6&t>>9-c|t*7&t>>12-c^t*9&t>>11-c^t*11&t>>22^t*19&t>>20^t*14&t>>20|t*23&t>>15-c|t*12&t>>9|t*30&t>>30|t>>5|t>>4)-31, m|h
Kenn Downey
quelle