성명서
이 작업은 일부 범용 프로그래밍 언어 (선택한 기능)를 사용하여 선택한 악기의 사운드 (한 음표 연주)를 합성하는 것입니다.
두 가지 목표가 있습니다.
- 결과 사운드의 품질. 실제 악기와 최대한 비슷해야합니다.
- 최소한. 코드를 1500 바이트 이하로 유지하는 것이 좋습니다 (기본 사운드 생성 만있는 경우는 적음).
생성 기능 만 제공하면되며, 상용구는 점수에 포함되지 않습니다.
불행히도 사운드 충실도에 대해서는 점수를 계산할 수 없으므로 엄격한 규칙을 적용 할 수 없습니다.
규칙 :
- 샘플 라이브러리, 전문 음악 생성에 의존하지 않습니다.
- 네트워크에서 다운로드하거나 마이크 또는 오디오 카드의 MIDI 또는 이와 유사한 외부 장치를 사용하려고 시도하지 않습니다.
- 코드 크기 측정 단위는 바이트입니다. 파일은 현재 디렉토리에 생성 될 수 있습니다. 기존 파일 (계수 테이블 등)이 존재할 수 있지만 해당 내용은 점수에 추가 + 이름으로 열어야합니다.
- 상용구 코드 (점수로 계산되지 않음)는 부호있는 정수의 배열 (목록)을 수신하고 출력 만 처리합니다.
- 출력 형식은 옵션 WAV 헤더를 사용하여 리틀 엔디안 16 비트 워드 (초당 44100 샘플)로 서명됩니다. 일반 wav 대신 압축 된 오디오를 출력하려고하지 않습니다.
- 합성을 위해 다른 기기를 선택하십시오 (또는 기기의 다른 품질 대 코드 크기 범주). 그러나 처음에 당신이 무엇을 시뮬레이션하고 있는지 말하지 말고 다른 사용자가 주석으로 추측하도록하십시오.
- 전자 기기는 권장하지 않습니다.
- 드럼은 악기입니다. 인간의 목소리는 악기입니다.
보일러 플레이트
다음은 일부 언어의 상용구입니다. 귀하의 언어와 비슷한 보일러 플레이트를 작성할 수 있습니다. "g"기능은 데모 용입니다 (1 초 440Hz 사인 톤).
씨:
//#!/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;
}
파이썬 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);
펄 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));
하스켈 :
#!/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
예
피아노 사운드를 모델링 한 ungolfed C 버전은 다음과 같습니다.
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);
}
}
}
}
약 1330 바이트를 기록하며 열악한 / 약용 품질을 제공합니다.
$><<7.chr
루비의 수에? : 9 자 P! 또는 $><<?\a
7 개의 문자