네, 제목을 잘 읽어보세요. 파이 소리를 재생합니다.
보다 구체적으로, 처음 1000의 모든 pi 자리수에 대해 음표에 매핑하고 결과 멜로디를 파일로 출력합니다.
기본적으로 각 숫자는 C 메이저 스케일 (기본적으로 일반 스케일)의 음표로 바뀝니다. 따라서 1은 중간 C로, 2는 D4로, 3은 E4로, 9는 D5 등으로 바뀝니다.
규칙
- 각 음표의 길이는 정확히 0.5 초 여야합니다.
- 멜로디에는 시작 3을 포함하여 pi의 첫 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
답변
매스 매 티카, 107 87 바이트
20 바이트를 절약 한 Martin Ender에게 감사합니다!
"t.au"~Export~Sound[SoundNote[⌊12Mod[#,10,1]/7⌋-1,.5]&/@#&@@RealDigits[Pi,10,1000]]
#&@@RealDigits[Pi,10,1000]
π의 첫 1000 자리 목록을 제공합니다. SoundNote[⌊12Mod[#,10,1]/7⌋-1
숫자에서 정확한 피치 번호 (0은 기본적으로 중간 C 임)를 생성합니다. 그런 다음 SoundNote[...,.5]&/@
해당 피치 이름을 1/2 초 길이의 사운드 객체 Sound
로 변환하여 실제 오디오 스 니펫으로 수집합니다. 마지막으로 "t.au"~Export~
Unix Audio Format 파일로 내 보냅니다. 대부분 확장명이 가장 짧은 지원 파일이지만 파일 이름을 얼굴 의 슬랩으로 π 만들기 때문입니다 !
이전 제출 :
"t.au"~Export~Sound[StringSplit["E5 C D E F G A B C5 D5"][[#+1]]~SoundNote~.5&/@#&@@RealDigits[Pi,10,1000]]
답변
파이썬 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...20198L
합니다. 후행 L
은 mapping을 통해 최종 채널 메시지 바이트를 생성하는 데 사용됩니다 ~ord(i)%29
.
p.mid
현재 작업 디렉토리에 이름이 지정된 단일 트랙 유형 1 미디 파일을 출력합니다 .
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
답변
스크래치 , 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
그래픽 :
Rabinowitz Wagon 스피 곳을 사용하여 한 번에 4 자리 숫자를 생성합니다.
답변
R, 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)
패키지 Rmpfr
를 사용 하여 pi 자리에서 정확한 정밀도를 얻습니다. .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)
답변
C (gcc) 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;}}}
언 골프 버전 :
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()
, 나는 C4에서 E5까지의 음에 해당하는 주파수를notes
배열에 저장했습니다. - 상점
pi
이 할 수있는 buffer.In 순서 1000 개 숫자 다음에 값을, 나는 설치된pi
내 컴퓨터에 패키지를, 그리고 사용popen
의 출력을 읽을pi 1000
과에 저장char
버퍼입니다. for
루프를 사용 하여 버퍼의 모든 한 자리에 해당하는 메모를 생성switch
하는play()
함수를 호출했습니다pi
. ,
사용법 : ./binary_name.o | aplay
최신 Linux 배포판에서는 이전 배포판으로 리디렉션합니다./dev/audio