Tuyên bố
Nhiệm vụ là tổng hợp âm thanh (một nốt nhạc đã phát) của một số nhạc cụ (bạn chọn) sử dụng chức năng trong một số ngôn ngữ lập trình mục đích chung (theo lựa chọn của bạn).
Có hai mục tiêu:
- Chất lượng âm thanh thu được. Nó nên giống với nhạc cụ thực sự tốt nhất có thể;
- Tối thiểu. Giữ mã dưới 1500 byte được khuyến khích (ít hơn nếu chỉ có phát âm cơ bản).
Chỉ cần cung cấp chức năng tạo, nồi hơi không được tính cho điểm.
Thật không may, không có điểm nào có thể được tính cho độ trung thực của âm thanh, vì vậy không thể có các quy tắc nghiêm ngặt.
Quy tắc:
- Không phụ thuộc vào thư viện mẫu, những thứ tạo nhạc chuyên dụng;
- Không tải xuống từ mạng hoặc cố gắng sử dụng MIDI của micrô hoặc thẻ âm thanh hoặc thứ gì đó quá bên ngoài như thế này;
- Đơn vị đo kích thước mã là byte. Tập tin có thể được tạo trong thư mục hiện tại. Các tệp có sẵn (bảng hệ số, v.v.) có thể tồn tại, nhưng nội dung của chúng được thêm vào điểm số + chúng phải được mở bằng tên.
- Mã soạn sẵn (không được tính để ghi điểm) nhận được mảng (danh sách) các số nguyên đã ký và chỉ giao dịch với việc xuất chúng.
- Định dạng đầu ra được ký ít từ 16 bit endian, 44100 mẫu mỗi giây, với tiêu đề WAV tùy chọn. Không cố gắng để phát ra âm thanh nén thay vì wav đơn giản;
- Vui lòng chọn các công cụ khác nhau để tổng hợp (hoặc loại chất lượng khác với loại kích thước mã cho công cụ); nhưng ban đầu đừng nói bạn đang mô phỏng cái gì - hãy để người dùng khác đoán trong các bình luận;
- Nhạc cụ điện tử không được khuyến khích;
- Trống là một nhạc cụ. Giọng nói của con người là một nhạc cụ.
Nồi hơi
Dưới đây là mẫu nồi hơi cho một số ngôn ngữ. Bạn có thể viết tấm nồi hơi tương tự cho ngôn ngữ của bạn là tốt. Nhận xét chức năng "g" chỉ dành cho bản demo (âm hình sin 1 giây 440 Hz).
C:
//#!/usr/bin/tcc -run
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
/*
void g(signed short *array, int* length) {
*length = 44100;
int i;
for(i=0; i<44100; ++i) array[i]=10000*sin(i*2.0*3.14159265358979323*440.0/44100.0);
}
*/
// define your g here
signed short array[44100*100];
int main(int argc, char* argv[]) {
int size=0;
memset(array,0,sizeof array);
// i(array); // you may uncomment and implement some initialization
g(array, &size);
fwrite("RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00GolfNote\0\0\0\0\0\0data\x00\xff\xff\xff", 1, 80, stdout);
fwrite(array, 1, size*sizeof(signed short), stdout);
return 0;
}
Con trăn 2:
#!/usr/bin/env python
import os
import re
import sys
import math
import struct
import array
#def g():
# return [int(10000*math.sin(1.0*i*2*3.141592654*440.0/44100.0)) for i in xrange(0,44100)]
# define your g here
sys.stdout.write("RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00GolfNotePy\0\0\0\0data\x00\xff\xff\xff");
array.array("h", g()).tofile(sys.stdout);
Perl 5:
#!/usr/bin/perl
#sub g() {
# return (map 10000*sin($_*3.14159265358979*2*440.0/44100.0), 0..(44100-1))
#}
# define you g here
my @a = g();
print "RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\x00INFOISFT\x0e\x00\x00\x00GolfNotePl\0\0\0\0data\x00\xff\xff\xff";
print join("",map(pack("s", $_), @a));
Haskell:
#!/usr/bin/runhaskell
import qualified Data.Serialize.Put as P
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C8
import Data.Word
import Control.Monad
-- g :: [Word16]
-- g = map (\t->floor $ 10000 * sin(t*2*3.14159265358979*440/44100)) [0..44100-1]
-- insert your g here
main = do
B.putStr $ C8.pack $ "RIFFH\x00\x00\x00WAVEfmt\x20\x12\x00\x00\x00\x01\x00\x01\x00\x44\xac\x00\x00\x88X\x01\x00\x02\x00\x10\x00\x00\x00LIST\x1a\x00\x00\0INFOISFT\x0e\x00\x00\x00GolfNote\0\0\0\0\0\0data\x00\xff\xff\xff"
B.putStr $ P.runPut $ sequence_ $ map P.putWord16le g
Thí dụ
Đây là phiên bản C không được mô phỏng theo âm thanh piano:
void g(signed short *array, int* length) {
*length = 44100*5;
int i;
double overtones[]={4, 1, 0.5, 0.25, 0.125};
double freq[] = {393, 416, 376, 355, 339, 451, 555};
double freq_k[] = {40, 0.8, 1, 0.8, 0.7, 0.4, 0.25};
double corrector = 1/44100.0*2*3.14159265358979323;
double volumes_begin[] ={0, 0.025, 0.05, 0.4};
double volumes_end [] ={0.025, 0.05, 0.4, 5};
double volumes_kbegin[]={0, 1.8, 1, 0.4};
double volumes_kend [] ={1.8, 1, 0.4, 0};
for(i=0; i<44100*5; ++i) {
int j;
double volume = 0;
for(j=0; j<sizeof volumes_begin/sizeof(*volumes_begin); ++j) {
double t = i/44100.0;
if(t>=volumes_begin[j] && t<volumes_end[j]) {
volume += volumes_kbegin[j]*(volumes_end[j]-t )/(volumes_end[j]-volumes_begin[j]);
volume += volumes_kend[j] *(t-volumes_begin[j])/(volumes_end[j]-volumes_begin[j]);
}
}
int u;
for(u=0; u<sizeof freq/sizeof(*freq); ++u) {
for(j=0; j<sizeof overtones/sizeof(*overtones); ++j) {
double f = freq[u]*(j+1);
array[i] += freq_k[u]*volume*10000.0/(f)/1*overtones[j]*sin(1.0*i*corrector*f);
}
}
}
}
Nó đạt khoảng 1330 byte và cung cấp chất lượng kém / tầm thường.
q
sẽ giống như thế này: pastebin.com/ZCB1v7QQ . Là chủ nhà của bạn lớn cuối?
$><<7.chr
tính Ruby không? : P cho 9 ký tự! hoặc $><<?\a
trong 7 ký tự