बयान
कार्य कुछ सामान्य प्रयोजन प्रोग्रामिंग भाषा (आपकी पसंद के) में फ़ंक्शन का उपयोग करके कुछ संगीत वाद्ययंत्र (आपकी पसंद का एक नोट) को ध्वनि को संश्लेषित करना है।
दो लक्ष्य हैं:
- परिणामी ध्वनि की गुणवत्ता। इसे यथासंभव वास्तविक उपकरण जैसा दिखना चाहिए;
- Minimality। 1500 बाइट्स के तहत कोड रखने की सलाह दी जाती है (यदि केवल मूल ध्वनि उत्पन्न होती है)।
केवल पीढ़ी फ़ंक्शन प्रदान करने की आवश्यकता है, बॉयलरप्लेट को स्कोर के लिए नहीं गिना जाता है।
दुर्भाग्य से ध्वनि निष्ठा के लिए कोई स्कोर की गणना नहीं की जा सकती है, इसलिए सख्त नियम नहीं हो सकते हैं।
नियम:
- नमूना पुस्तकालयों, विशेष संगीत पीढ़ी की चीजों पर कोई निर्भरता नहीं;
- नेटवर्क से डाउनलोड नहीं करना या माइक्रोफ़ोन या ऑडियो कार्ड के MIDI या इस तरह से बाहरी कुछ भी उपयोग करने की कोशिश करना;
- कोड आकार माप इकाई बाइट्स है। फ़ाइल वर्तमान निर्देशिका में बनाई जा सकती है। पहले से मौजूद फाइलें (गुणांक तालिकाएं, आदि) मौजूद हो सकती हैं, लेकिन उनकी सामग्री स्कोर में जोड़ी जाती है + उन्हें नाम से खोला जाना चाहिए।
- बॉयलरप्लेट कोड (स्कोर करने के लिए नहीं गिना जाता) पर हस्ताक्षर किए गए पूर्णांकों की सरणी (सूची) प्राप्त होती है और केवल उन्हें आउटपुट करने से संबंधित है।
- वैकल्पिक WAV हैडर के साथ आउटपुट फॉर्मेट में प्रति सेकंड 16-बिट शब्दों, 44100 नमूनों पर हस्ताक्षर किए जाते हैं। सादे wav के बजाय संपीड़ित ऑडियो आउटपुट करने की कोई कोशिश नहीं कर रहा है;
- कृपया सिंथेसाइज़ करने के लिए विभिन्न उपकरणों का चयन करें (या अन्य गुणवत्ता बनाम उपकरण के लिए कोड आकार श्रेणी); लेकिन शुरू में यह नहीं बताएं कि आप क्या अनुकरण कर रहे हैं - अन्य उपयोगकर्ताओं को टिप्पणियों में अनुमान लगाने दें;
- इलेक्ट्रॉनिक उपकरणों को हतोत्साहित किया जाता है;
- ढोल एक वाद्य है। मानव आवाज एक यंत्र है।
Boilerplates
यहाँ कुछ भाषाओं के बॉयलर हैं। आप अपनी भाषा के लिए भी इसी तरह की बॉयलर प्लेट लिख सकते हैं। "जी" फ़ंक्शन टिप्पणी के लिए एक डेमो (1 सेकंड 440 हर्ट साइन टोन) के लिए है।
सी:
//#!/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
उदाहरण
पियानो ध्वनि के बाद यहां अनलोडेड सी संस्करण प्रस्तुत किया गया है:
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 बाइट्स स्कोर करता है और खराब / औसत दर्जे की गुणवत्ता प्रदान करता है।
q
चाहिए: pastebin.com/ZCB1v7QQ । क्या आपका होस्ट बड़ा एंडियन है?
$><<7.chr
रूबी गिनती में? : 9 अक्षरों के लिए P! या $><<?\a
7 वर्ण के लिए