पाई की आवाज बजाएं


15

हाँ, आपने सही पढ़ा। पी की आवाज़ बजाओ।

विशेष रूप से, पहले 1000 में पाई के प्रत्येक अंक के लिए, इसे एक संगीत नोट पर मैप करें और परिणामस्वरूप मेलोडी को एक फ़ाइल में आउटपुट करें।

मूल रूप से, प्रत्येक अंक सी मेजर स्केल (मूल रूप से सामान्य पैमाने) पर एक नोट में बदल जाता है। इसलिए 1 मध्य C में बदल जाता है, 2 D4 में बदल जाता है, 3 E4 में बदल जाता है, 9 D5 में बदल जाता है।

नियम

  • प्रत्येक नोट ठीक 0.5 सेकंड लंबा होना चाहिए।
  • माधुर्य में शुरुआती 3 सहित पीआई के पहले 1000 अंक होने चाहिए।
  • 1 से 7 मध्य C से B4 तक, 8 C5, 9 D5 है और 0 E5 है
  • सभी अच्छी तरह से समर्थित फ़ाइल स्वरूपों की अनुमति है, जब तक कि वे इस चुनौती से पहले बनाए गए थे।
  • प्रारंभ और समाप्ति सहित फ़ाइल में कहीं भी कोई रोक नहीं हो सकती है।
  • खेला जाने वाला उपकरण कोई मायने नहीं रखता। यह एक पियानो, साइन लहर, वास्तव में कुछ भी हो सकता है, जब तक कि सही ध्वनि आसानी से भारी हो।
  • इसे कोई इनपुट नहीं लेना चाहिए और फ़ाइल के अलावा कोई आउटपुट नहीं देना चाहिए। अन्य फ़ाइलों से पढ़ना बंद है।
  • मानक खामियों को मना किया जाता है।

उदाहरण गणित कोड:

(*please forgive me for this horrible, horrible mess of code*)
digits = RealDigits[Pi, 10, 1000][[1]] /. {0 -> 10};
weights = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16}; 
melody = {};
For[i = 1, i < 1001, i++, melody = {melody , Sound[SoundNote[weights[[digits[[i]]]], 0.5]]}]
final = Sound[Flatten[melody]];
Export["C:\\Mathematica Shenanigans\\pi.wav", final];

उदाहरण माधुर्य पहले 100 अंक दिखा रहा है: http://vocaroo.com/i/s0cfEILwYb8M

आपकी पवित्रता के लिए, प्रत्येक नोट के लिए पिचों की एक तालिका और प्रत्येक अंक क्या नोट दर्शाता है:

Digit 1: C: 261.63 Hz
Digit 2: D: 293.66 Hz
Digit 3: E: 329.63 Hz
Digit 4: F: 349.23 Hz
Digit 5: G: 392.00 Hz
Digit 6: A: 440.00 Hz
Digit 7: B: 493.88 Hz
Digit 8: C5: 523.25 Hz
Digit 9: D5: 587.33 Hz
Digit 0: E5: 659.25 Hz

5
9 डी 5 की ओर मुड़ता है आपको स्पष्ट करना चाहिए कि अन्य नोट्स इन 4-ऑक्टेव में हैं। इसके अलावा, आपकी तालिका में अंक 0अंतिम है ( E5)?
लुइस मेंडो

1
@LuisMendo हाँ यह करता है। मैं इन्हें और अधिक स्पष्ट करूँगा।
सागिस्प्स

1
क्या हम 'वेल सपोर्टेड फॉरमेट' मान सकते हैं, जिसका मतलब vlc द्वारा कुछ भी ओपन किया जा सकता है?
पावेल

@ पावेल बहुत ज्यादा
sagiksp

अगर मेरी भाषा साउंड फाइल्स को साउंड या राइटिंग सपोर्ट नहीं करती है तो क्या मैं नोट नाम (जैसे 3.14 -> ECF) आउटपुट कर सकता हूं?
FinW

जवाबों:


10

गणितज्ञ, 107 87 बाइट्स

20 बाइट बचाने के लिए मार्टिन एंडर को धन्यवाद!

"t.au"~Export~Sound[SoundNote[⌊12Mod[#,10,1]/7⌋-1,.5]&/@#&@@RealDigits[Pi,10,1000]]

#&@@RealDigits[Pi,10,1000]list के पहले 1000 अंकों की सूची देता है। SoundNote[⌊12Mod[#,10,1]/7⌋-1एक अंक से सही पिच नंबर (जहां 0 डिफ़ॉल्ट रूप से मध्य C है) का उत्पादन करता है। फिर SoundNote[...,.5]&/@उस पिच नाम को 1/2 सेकंड की ध्वनि वस्तु में बदल देता है, जो Soundएक वास्तविक ऑडियो स्निपेट में इकट्ठा होता है। अंत "t.au"~Export~में एक यूनिक्स ऑडियो प्रारूप फ़ाइल को निर्यात करता है, ज्यादातर क्योंकि एक्सटेंशन सबसे कम समर्थित एक है, लेकिन यह भी क्योंकि हम फाइलनाम को चेहरे पर ix करने के लिए एक थप्पड़ बनाने के लिए मिलते हैं !

पिछला सबमिशन:

"t.au"~Export~Sound[StringSplit["E5 C D E F G A B C5 D5"][[#+1]]~SoundNote~.5&/@#&@@RealDigits[Pi,10,1000]]

10

पायथन 2, 182 बाइट्स

x=p=6637
while~-p:x=p/2*x/p+2*10**999;p-=2
s="MThd\0\0\0\6\0\1\0\1\342\4MTrk\0\0\13\301\0\220"
for i in`x`:s+="JHGECA@><L\260"[~ord(i)%29]+'{<'
open('p.mid','w').write(s+"\0\377/\0")

`x`का उत्पादन करेगा 31415926...20198LLमैपिंग के माध्यम से अंतिम चैनल संदेश बाइट का उत्पादन करने के लिए ट्रेलिंग का उपयोग किया जाता है ~ord(i)%29

एक एकल ट्रैक टाइप 1 मिडी फ़ाइल को आउटपुट करता है, जिसे p.midवर्तमान कार्यशील निर्देशिका का नाम दिया गया है।

0000: 4d 54 68 64 00 00 00 06  MThd....  # Midi header, 6 bytes to follow
0008: 00 01 00 01              ....      # Type 1, 1 track
000c: e2 04                    â.        # (-)30 ticks per beat, 4 beats per second

000e: 4d 54 72 6b 00 00 0b c1  MTrk...Á  # Track header, 3009 bytes to follow
0016: 00 90 40 7b              ..@{      # Wait  0 ticks, play E4 (3), 97% volume
001a: 3c 3c 7b                 <<{       # Wait 60 ticks, play C4 (1), 97% volume
001d: 3c 41 7b                 <A{       # Wait 60 ticks, play F4 (4), 97% volume
0020: 3c 3c 7b                 <<{       # Wait 60 ticks, play C4 (1), 97% volume
0023: 3c 43 7b                 <C{       # Wait 60 ticks, play G4 (5), 97% volume
...
0bcf: 3c b0 7b 3c              <°{<      # Wait 60 ticks, all notes off
0bd3: 00 ff 2f 00              .ÿ/.      # End of track marker

1
काफी देर हो चुकी है, लेकिन अगर आप सोच रहे हैं कि पीआई फॉर्मूला का क्या उपयोग किया जाता है, तो यह mathworld.wolfram.com/PiFormulas.html पर फॉर्मूला 25 पर एक बदलाव है ।
सैमुअल ली

6

स्क्रैच , 530 बाइट्स

BookOwl के जवाब से प्रेरित ।

ऑनलाइन प्रदर्शन । प्लेबैक तुरंत शुरू होगा, spaceबंद करने और रीसेट करने के लिए दबाएं । फिर से शुरू करने के लिए बिल्ली पर क्लिक करें।

संपादित करें: थोड़ा नीचे गोल्फ। मुझे आधिकारिक विकि पर कुछ गोल्फ युक्तियाँ मिलीं ।

when gf clicked
set[c v]to[4e3
repeat(c
add[2e3]to[f v
end
repeat(250
set[b v]to(c
set[h v]to((d)mod(1e4
change[c v]by(-16
repeat(b
set[d v]to(((d)*(b))+((1e4)*(item(b)of[f v
set[g v]to(((2)*(b))-(1
replace item(b)of[f v]with((d)mod(g
set[d v]to(((d)-((d)mod(g)))/(g
change[b v]by(-1
end
change[h v]by(((d)-((d)mod(1e4)))/(1e4
repeat(4
add((h)mod(10))to[a v
set[h v]to(((h)-((h)mod(10)))/(10
end
repeat(4
say(item(last v)of[a v
play note((round((((item(last v)of[a v])-(1))mod(10))*(1.78)))+(60))for(0.5)beats
delete(last v)of[a v

ग्राफिकल:

एक बार में 4 अंक उत्पन्न करने के लिए रैबिनोविट वैगन स्पिगोट का उपयोग करता है।


3

आर, 450 बाइट्स

N=261.63*(2^(1/12))^c(16,0,2,4,5,7,9,11,12,14);S=44100;s=unlist(sapply(el(strsplit(as(Rmpfr::Const("pi",1e5),"character"),""))[c(1,3:1001)],function(x)sin(0:(0.5*S-1)*pi*2*N[(x:1)[1]+1]/S)));c=32767*s/max(abs(s));a=file("p.wav","wb");v=writeChar;w=function(x,z)writeBin(as.integer(x),a,z,e="little");v("RIFF",a,4,NULL);w(36+S*10,4);v("WAVEfmt ",a,8,NULL);w(16,4);w(c(1,1),2);w(S*1:2,4);w(c(2,16),2);v("data",a,4,NULL);w(2*length(s),4);w(c,2);close(a)

RmpfrPi अंकों पर सही सटीकता प्राप्त करने के लिए पैकेज का उपयोग करता है । एक .wavफ़ाइल आउटपुट करता है।

नई लाइनों और टिप्पणियों के साथ प्रस्तुत:

N=261.63*(2^(1/12))^c(16,0,2,4,5,7,9,11,12,14) # Frequency of each notes
S=44100 #Sampling rate
s=unlist(sapply(el(strsplit(
                   as(Rmpfr::Const("pi",1e5),"character"), #get pi correct digits as a character string
                   ""))[c(1,3:1001)], #Grabs first 1000 digits
                function(x)sin(0:(0.5*S-1)*pi*2*N[(x:1)[1]+1]/S))) #Wave function
c=32767*s/max(abs(s)) #Normalize to range [-32767;32767] as per wav 16-bit standard
a=file("p.wav","wb")
v=writeChar
w=function(x,z)writeBin(as.integer(x),a,z,e="little")
v("RIFF",a,4,NULL)     #ChunkID
w(36+S*10,4)           #Chunksize
v("WAVEfmt ",a,8,NULL) #Format, followed by SubChunk1ID
w(16,4)                #SubChunk1Size
w(c(1,1),2)            #AudioFormat & NumChannels
w(S*1:2,4)             #SampleRate & ByteRate
w(c(2,16),2)           #BlockAlign & BitsPerSample
v("data",a,4,NULL)     #SubChunk2ID
w(2*length(s),4)       #Subchunk2Size
w(c,2)                 #Actual data
close(a)

0

सी (जीसीसी) 572 बाइट्स

p(float f){i;char b[10000];p=3.14;for(i= 0;i<5000;i++){b[i]=35*sin(f*(2*p*i)/10000);putchar(b[i]);}} f(){i;FILE *f;char p[1001];float n[10];n[0]= 261.63;for(i=1;i<=6;i++){if(i==3)n[i]=349.23;else n[i]=1.12231*n[i-1];}for(i=7;i<=9;i++)n[i]=2*n[i-7];f=popen("pi 1000","r");fgets(p,sizeof(p)-1,f);for(i=0;i<999;i++){switch(p[i]){case'1':p(n[0]);break;case'2':p(n[1]);break;case'3':p(n[2]);break;case'4':p(n[3]);break;case'5':p(n[4]);break;case'6':p(n[5]);break;case'7':p(n[6]);break;case'8':p(n[7]);break;case'9':p(n[8]);break;case'0':p(n[9]);break;default:p(n[0]);break;}}}

Ungolfed संस्करण:

void play(float freq)
{
    char buffer[10000];
    float pi=3.14;
    for(int i = 0; i<5000; i++)
    {
       buffer[i] = 35*sin(freq*(2*pi*i)/10000 );
       putchar(buffer[i]);
    }
}

void f()
{
    FILE *fp;
    char pi[1001];
    float note[10];
    note[0]= 261.63;

    for(int i=1;i<=6;i++)     
    {
       if(i==3)
         note[i]=349.23;
       else
         note[i]=1.12231*note[i-1]; 
    }      

    for(int i=7;i<=9;i++)
      note[i]=2*note[i-7];

   fp=popen("pi 1000","r" );
   fgets(pi, sizeof(pi)-1, fp);  

   for(int i=0;i<1001;i++)
   {
    switch(pi[i])
    {   
        case '1': play(note[0]);break;
        case '2': play(note[1]);break;
        case '3': play(note[2]);break;
        case '4': play(note[3]);break;
        case '5': play(note[4]);break;
        case '6': play(note[5]);break; 
        case '7': play(note[6]);break;
        case '8': play(note[7]);break;
        case '9': play(note[8]);break;
        case '0': play(note[9]);break;
        default : play(note[0]);break;
    }

  }     
}

स्पष्टीकरण:

  • play(float freq) नोट के एक पैरामीटर (हार्डकोड) के रूप में आप आवृत्ति को नियमित रूप से लेते हैं जिसे आप खेलना चाहते हैं और बफर में साइन वेव स्टोर करते हैं।
  • फ़ंक्शन में f(), मैंने notesसरणी में C4 से E5 तक के नोटों के अनुरूप आवृत्तियों को संग्रहीत किया ।
  • स्टोर piयह करने के लिए एक buffer.In क्रम में 1000 संख्याएं आती हैं मूल्य, मैं स्थापित piमेरी मशीन पर पैकेज, और उपयोग popenके उत्पादन में पढ़ने के लिए pi 1000और एक में संग्रहीत charबफर।
  • forलूप का उपयोग करना और switchमैंने बफर play()में हर एक अंक के अनुरूप नोट्स बनाने के लिए फ़ंक्शन को बुलाया pi। ,

उपयोग: ./binary_name.o | aplayआधुनिक लिनक्स वितरण पर, पुराने वितरण पर आप इसे पुनर्निर्देशित करेंगे/dev/audio


switch(foo){...}जैसे कुछ के साथ पूरे की जगह सुझाव दें play(note[(foo-'1')%10])। इसके अलावा, सी में गोल्फिंग के लिए टिप्स
छत के छत पर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.