Viết thành phần bytebeat đẹp nhất


24

Bytebeat là một phong cách âm nhạc người ta có thể sáng tác bằng cách viết một chương trình C đơn giản mà đầu ra được dẫn đến aplayhoặc /dev/dsp.

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

Có rất nhiều thông tin trên trang web bytebeat , triển khai javascript và nhiều bản trình diễn và ví dụ trong chủ đề này .

Quy tắc rất đơn giản: Cố gắng viết một tác phẩm nghe khá hay. Hầu hết các phiếu bầu đều thắng vì điều đó rõ ràng là chủ quan, mặc dù không phải là chủ quan khi xem xét các kết quả thông thường.



Bạn đang giữ điều này để bytebeat nghiêm ngặt (tức là không có bộ đệm)?
Peter Taylor

4
Tại sao nó bị hạn chế ở C?
người dùng không xác định

Không có bất kỳ lý do nội tại nào để hạn chế sử dụng bộ đệm hoặc các ngôn ngữ khác, nhưng thông thường, bytebeat có nghĩa là vòng lặp C cụ thể với đầu ra được xác định bởi một công thức. Tôi đã bình chọn cho Joey Adams câu trả lời thậm chí nghĩ rand()là không chuẩn.
Jeff Burdges

Mặc dù tôi thích ý tưởng này, Câu hỏi thường gặp đòi hỏi một tiêu chí chiến thắng khách quan (quá dễ để bị mắc kẹt trong các tính toán hoặc nghệ thuật ASCII). Chúng ta có thể tìm kiếm một cái gì đó được xác định tốt hơn "đẹp"?
dmckee

Câu trả lời:


16

(Đã ký 16 endian nhỏ, 8000Hz mono ( --format=S16_LE))

Âm nhạc

Nhiều hơn so với trước đây! (mặc dù nó khá dài)

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

(Bạn có thể nghe điều này tại đây )

Tôi đã viết điều này, nhưng thậm chí tôi không biết một số phần hoạt động như thế nào >0, và đặc biệt là phần đầu tiên 7&.

Thay đổi vòng lặp thành for(;!(t>>22);t++)... để nghe "một lần". Tuy nhiên, tôi không biết liệu nó có "vòng lặp" giống hệt như vậy không.

Giai điệu (cơ sở của âm nhạc trên)

Tôi yêu giai điệu này do tôi tạo ra (CGAF ftw), nhưng nó quá 'đơn giản' ...

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

Âm nhạc đơn giản (mà tôi đã làm trước đây)

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


Nếu bạn nhấp vào liên kết bytebeat ở trên, bạn sẽ thấy một dòng lệnh sox để chuyển đổi nó thành tệp .wav và một dòng lệnh máy nén lẻ.
Jeff Burdges

3
+1 Tuyệt vời! Một vài bit (ví dụ 1:30 - 1:40) nghe có vẻ "nói lắp", nhưng một lần nữa, phần lớn sự quyến rũ của bytebeat nằm ở những nhịp điệu và giai điệu kỳ quặc và độc đáo này, và hiệu ứng tổng thể là tuyệt vời. (Ps. Tôi đã vô tình chơi trò này với 8 bit cho mỗi mẫu và tôi cũng nghe có vẻ tốt đến mức đó. Giống như chơi vinyl 45 vòng / phút ở 33,3 vòng / phút.)
Ilmari Karonen

3

Hàm thước trong C nhỏ:

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

Giai điệu hay, nhưng để trở thành một "sáng tác" thì IMO này cần một thứ gì đó nữa ...
Ilmari Karonen

3
main(t){for(;;t+=(t%6)?1:2)putchar((((t<<t^(t>>8))|(t<<7))*((t<<t&(t>>12))|(t<<10))));}

Bytebeat rất cổ điển, nếu đó không phải là một oxymoron. +1 từ tôi.
Ilmari Karonen

3

Nhấn mạnh "beat" trên "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));}

Được sử dụng ở 8 kHz, đơn sắc uint8. Âm thanh tốt nhất qua loa có khả năng bass trầm.


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

Âm thanh như đại dương ;-)


1
Giống như một đường sắt thực sự bận rộn băng qua tôi. :)
Ilmari Karonen

5
Protip: nếu âm thanh như âm liên tục, RNG của bạn bị hỏng.
Ông Llama

3
cách dễ dàng hơn:$ cat /dev/urandom | aplay
Braden Tốt nhất

2
@ B1KMusic đơn giản hơn nhiều:aplay /dev/urandom
minmaxavg

0

Giai điệu kết hợp và hòa âm:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.