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.



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));}


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;
}

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))));}

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.


2
main(){for(;;)putchar(rand());}

Klingt nach Meer ;-)


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.