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.



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


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

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

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.


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

Brzmi jak ocean ;-)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.