Napisz najładniejszą kompozycję bajtek

24

Bytebeat to styl muzyczny, który można komponować, pisząc prosty program w języku C, którego dane wyjściowe są przesyłane strumieniowo do aplaylub /dev/dsp.

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

Na stronie bytebeat znajduje się sporo informacji , implementacja javascript oraz więcej demonstracji i przykładowych kompozycji w tym wątku .

Bardzo proste zasady: spróbuj napisać ładnie brzmiącą kompozycję. Większość głosów wygrywa, ponieważ jest to oczywiście subiektywne, choć nie tak subiektywne, biorąc pod uwagę zwykłe wyniki.

Jeff Burdges
źródło
Czy trzymasz to ścisłe bajtowanie (tj. Brak buforów)?
Peter Taylor
4
Dlaczego jest ograniczony do C?
użytkownik nieznany
Nie ma żadnego wewnętrznego powodu, aby ograniczać używanie buforów lub innych języków, ale zwykle bytebeat oznacza tę określoną pętlę C z wyjściem zdefiniowanym przez formułę. Głosowałem za odpowiedzią Joeya Adamsa, nawet jeśli uważałem, że rand()jest niestandardowa.
Jeff Burdges
Chociaż podoba mi się ten pomysł, FAQ wymaga obiektywnych kryteriów wygranej (zbyt łatwo jest uwięzić w obliczeniach lub grafice ASCII). Czy możemy szukać czegoś lepiej zdefiniowanego niż „ładna”?
dmckee

Odpowiedzi:

16

(Podpisano 16-bitowy mały endian, 8000 Hz mono ( --format=S16_LE))

Muzyka

Znacznie lepiej niż wcześniej! (chociaż jest dość długi)

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

(Możesz posłuchać tutaj )

Napisałem to, ale nawet nie wiem, jak działa jakaś część, jak >0i (szczególnie) pierwsza 7&.

Zmień na loop, aby for(;!(t>>22);t++)... słuchać go „raz”. Nie wiem jednak, czy „zapętla się” dokładnie w ten sam sposób.

Melodia (baza powyższej muzyki)

Uwielbiam tę melodię, którą stworzyłem (CGAF ftw), ale jest ona zbyt „prosta” ...

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

Prosta muzyka (którą wcześniej stworzyłem)

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

JiminP
źródło
Jeśli klikniesz powyższy link bytebeat, zobaczysz wiersz polecenia sox, aby przekonwertować go na plik .wav, i wiersz polecenia nieparzystej sprężarki.
Jeff Burdges
3
+1 niesamowite! Kilka bitów (np. 1:30 - 1:40) brzmi trochę jak „jąkanie”, ale z drugiej strony wiele uroku bajtebraza tkwi w tych dziwnych i niekonwencjonalnych rytmach i melodiach, a ogólny efekt jest doskonały. (Ps. Przypadkowo grałem to przy 8 bitach na próbkę, i też brzmi zaskakująco dobrze. Coś jak gra na winylu 45 rpm przy 33,3 rpm.)
Ilmari Karonen
3

Funkcja linijki 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
źródło
Fajna melodia, ale aby być „kompozycją”, ta IMO potrzebuje czegoś więcej ...
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
źródło
Bardzo klasyczny bajgiel, jeśli to nie jest oksymoron. +1 ode mnie
Ilmari Karonen,
3

Podkreślając „bicie” nad „bajtem”:

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

Do użytku przy częstotliwości 8 kHz, mono uint8. Najlepiej brzmi w porównaniu z głośnikami o niskich basach.

przestał się obracać w lewo
źródło
2
main(){for(;;)putchar(rand());}

Brzmi jak ocean ;-)

Joey Adams
źródło
1
Bardziej jak dla mnie naprawdę zajęty przejazd kolejowy. :)
Ilmari Karonen
5
Protip: jeśli brzmi jak ciągły dźwięk, twoja RNG jest zepsuta.
Pan Llama,
3
łatwiejszy sposób:$ cat /dev/urandom | aplay
Braden Best
2
@ B1KMusic o wiele prostsze:aplay /dev/urandom
minmaxavg
0

Połączona melodia i harmonia:

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
źródło