Tulis komposisi bytebeat tercantik

24

Bytebeat adalah gaya musik yang dapat digubah dengan menulis program C sederhana yang hasilnya disalurkan ke aplayatau /dev/dsp.

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

Ada banyak informasi di situs bytebeat , implementasi javascript , dan lebih banyak demo dan contoh komposisi di utas ini .

Aturan yang sangat sederhana: Cobalah untuk menulis komposisi yang cukup terdengar. Suara terbanyak menang karena itu jelas subyektif, meskipun tidak subyektif mengingat hasil yang biasa.

Jeff Burdges
sumber
Apakah Anda memegang ini dengan bytebeat ketat (yaitu tidak ada buffer)?
Peter Taylor
4
Mengapa dibatasi hanya untuk C?
pengguna tidak diketahui
Tidak ada afaik alasan intrinsik untuk membatasi penggunaan buffer atau bahasa lain, tetapi biasanya bytebeat berarti bahwa loop C tertentu dengan output yang ditentukan oleh rumus. Saya memilih Joey Adams, jawaban yang menurut saya rand()tidak standar.
Jeff Burdges
Sementara saya menyukai ide ini, FAQ meminta kriteria pemenang yang objektif (terlalu mudah untuk terjebak dalam perhitungan atau seni ASCII). Bisakah kita mencari sesuatu yang lebih baik daripada "cantik"?
dmckee

Jawaban:

16

(Menandatangani 16-bit little endian, 8000Hz mono ( --format=S16_LE))

Musik

Jauh lebih baik dari sebelumnya! (meskipun cukup panjang)

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

(Anda dapat mendengarkan ini di sini )

Saya menulis ini, tetapi bahkan saya tidak tahu bagaimana beberapa bagian bekerja, seperti >0dan (terutama) yang pertama 7&.

Ubah untuk loop ke for(;!(t>>22);t++)... untuk mendengarkannya 'sekali'. Saya tidak tahu apakah itu "loop" dengan cara yang persis sama.

Melody (basis musik di atas)

Saya suka melodi yang saya buat (CGAF ftw), tapi terlalu 'polos' ...

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

Musik sederhana (yang saya buat sebelumnya)

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

JiminP
sumber
Jika Anda mengklik tautan bytebeat di atas, Anda akan melihat baris perintah sox untuk mengonversinya menjadi file .wav, dan baris perintah kompresor ganjil.
Jeff Burdges
3
+1 Luar Biasa! Beberapa bit (mis. 1:30 - 1:40) terdengar seperti "gagap", tetapi sekali lagi, sebagian besar pesona bytebeat ada dalam irama dan melodi yang aneh dan tidak konvensional ini, dan efek keseluruhannya sangat bagus. (Mz. Saya tidak sengaja memainkan ini dengan kecepatan 8 bit per sampel, dan saya juga terdengar sangat bagus. Seperti memainkan vinyl 45 rpm pada 33,3 rpm.)
Ilmari Karonen
3

Fungsi penguasa di C minor:

#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
sumber
Melodi yang bagus, tetapi untuk menjadi "komposisi" IMO ini membutuhkan sesuatu yang lebih ...
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
sumber
Bytebeat yang sangat klasik, kalau itu bukan oxymoron. +1 dari saya.
Ilmari Karonen
3

Menekankan "beat" over "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));}

Untuk digunakan pada 8 kHz, uint8 mono. Terdengar lebih baik daripada pengeras suara bass yang bagus.

berhenti untuk memutar balik
sumber
2
main(){for(;;)putchar(rand());}

Kedengarannya seperti laut ;-)

Joey Adams
sumber
1
Lebih seperti sebuah kereta api yang sangat sibuk menyebrang ke saya. :)
Ilmari Karonen
5
Protip: jika terdengar seperti nada kontinu, RNG Anda rusak.
Tn. Llama
3
cara yang lebih mudah:$ cat /dev/urandom | aplay
Braden Best
2
@ B1KMusic jauh lebih sederhana:aplay /dev/urandom
minmaxavg
0

Melodi dan harmoni kombinasi:

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
sumber