말의 소리


11

사람들은 하나의 것을 다른 것으로 시각화 할 수있는 많은 것을 썼습니다. 이제는 글자를 음악으로 번역 할 수있는 방법을 제안합니다! 텍스트 파일을 가져 와서 각 문자가에서 특정 음표로 변환 된 사운드 파일을 출력하는 프로그램을 작성하는 작업입니다 C3-C8.

면책 조항-나는 실제로 음악이 잘 들리 리라고 기대하지는 않지만 놀라기를 바랍니다.

명세서

  • 파일 이름을 문자열로, BPM (분당 비트 수)을 정수로 사용합니다.
  • 당신은 대문자 A로 메모합니다C3
  • 그리고이 순서대로 모든 캐릭터에 대해 반 걸음 올라갑니다. ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • 예, 너무 많은 옥타브에 걸쳐 모든 문자가 사용되는 것은 아닙니다.
  • 이 방법으로 파일의 모든 문자를 번역합니다
  • 주어진 BPM에서 메모를 분기 메모로 모으십시오.
  • 사운드 파일로 저장하거나 (미디가 가장 쉬운 것 같지만 아무 문제가 없습니다) 재생하십시오
  • 제정신 입력 형식은 괜찮습니다
  • 표준 허점 없음
  • 이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 승리합니다!

보너스

  • 출력 전치 허용 -50 바이트
  • 여러 파일 ( 75 바이트) 을 가져 와서 여러 트랙이 서로 겹쳐 지도록 허용
  • 연속 된 문자를 하나의 더 긴 메모 -50 바이트로 결합

편집 : 와우, 우리는 음의 점수가 있습니다. 토요일에 우승자를 발표 할 예정입니다.


승자는 언제 결정됩니까?
LegionMammal978

입력에 나열되지 않은 문자가 포함되지 않는다고 가정 할 수 있습니까? 아니면 비공개 캐릭터를 만났을 때 어떻게해야합니까?
apillers

@apsillers 스냅에서 ! 그는 정의되지 않은 행동을 허용 할 것이라고 말했다.
LegionMammal978

샘플을 올렸습니다. 당신은 꽤 정확하고, 정말 좋은 소리를하지 않습니다 ...
Sanchises

답변:


6

MATLAB, 159-50-50-75 = -16

샘플 입력

샘플 출력

(톱니가 더 나은 점수도 가능하지만, 소리가 조금 ... 아주 펑키 순수한 사인 음파를 생성 너무 펑키). 함수로 작동하므로 ['abc';'def']'트랙'당 하나의 행 이있는 문자형 배열 ( )이 필요합니다. 나는 그것이 '모든 정상적인 입력 형식'에 포함되어 있다고 생각 하지만 일반적인 합의가 파일을 읽어야한다고 생각하면 파일을 변경할 수 있다고 가정합니다. 입력 i은 텍스트 트랙 (같은 길이), b분당 비트 수 및 t조옮김입니다 (조옮김되지 않은 경우 0 제공). 사인 입력을 오프셋하여 두 개의 사인을 하나의 블렌딩하므로 세 개의 보너스를 모두 얻었으므로 마이너스 점수를 얻었습니다.

function v(i,b,t)
s=0;for r=1:size(i)
o=[];for k=i(r,:)
o=cat(2,o,sin(55*pi*2^((k-28+t)/12)*(numel(o)/2^13+(0:1/2^13:60/b))));end
s=s+o;end
sound(s/max(s))
end

입력 파일을 사용하는 버전 : 211-175 = 36

입력 인수는 i이제 파일 이름을 나타내며 다른 매개 변수는 변경되지 않았습니다. textread더 이상 사용되지 않을 수 있는 경고가 표시되어 최신 릴리스에서는 작동하지 않을 수 있습니다. 편집 : 텍스트 읽기가 공백에서 자동으로 분할되므로 수정했습니다. 또한 테스트 중에 이상한 소리가 나는 외계인과 우연히 접촉했을 수도 있습니다.

function v(i,b,t)
i=textread(i,'%s','whitespace','','delimiter','\n');s=0;for r=1:size(i)
o=[];for k=i{r,:}
o=cat(2,o,sin(55*pi*2^((k-28+t)/12)*(numel(o)/2^13+(0:1/2^13:60/b))));end
s=s+o;end
sound(s/max(s))
end

어떤 버전을 선호하십니까? :)


음, 사양은 ... 파일에서 입력을 명시 적으로 말한다
LegionMammal978

@ LegionMammal978 주장하는 경우 : .mat파일은 정상적인 입력 형식입니다. 텍스트가있는 'i'변수를 사용하여 .mat 파일을 만듭니다. 그런 다음 load(i);최상위 버전의 2 행 시작 부분에 추가하십시오 . 점수 : -16 + 8 = -8. 귀하의 의견이 내 의견보다 더 많은지지를 받거나 OP에 의견이있을 때이 작업을 수행합니다.
Sanchises

4

스냅 ! -401-75 = 326

여기에서 온라인으로 사용해보십시오.

프로그램의 바이트 수 계산 방법 을 사용 하고 있습니다.

여기에 이미지 설명을 입력하십시오

한 번에 여러 사운드 재생을 추가했습니다.

기본 구조는 원본과 동일하지만 (아래 참조)가 추가되었습니다 launch{}.launch{}내부에 코드를 사용하여 새 스레드를 시작하여 동시성을 허용합니다.

텍스트 코드는 다음과 같습니다.

set[c v]to[ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
set[l v]to(list>
ask[BPM]and wait
set tempo to(answer)bpm
repeat until<(answer)=[
ask[notes]and wait
add(answer)to(l
end
delete(last v)of(l
for each(i)of(l
launch{
repeat(length of(i))(#
play note(i(c)(letter(#)of(i)))for(0.25)beats

(i(h)(n))
report(call(JavaScript function ([h][n]) {[return h.indexOf(n)+48]})with inputs(h)(n

원본 코드, 308.

여기에 이미지 설명을 입력하십시오

럭키 스냅! MIDI 재생 기능이 내장되어 있습니다.;)

불행히도, 그것은 indexOf기능이 없으므로 외부 자바 스크립트 호출을해야합니다.

repeat () (#)블록은 반복 라이브러리에서 제공됩니다.

코드는 다음과 같이 텍스트로 작성할 수 있습니다. 308 바이트를 얻는 방법입니다.

set[c v]to[ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
ask[BPM]and wait
set tempo to(answer)bpm
ask[notes]and wait
repeat(length of(answer))(#)
play note(i(c)(letter(#)of(answer)))for(0.25)beats

(i(h)(n))
report(call(JavaScript function ([h][n]) {[return h.indexOf(n)+48]})with inputs(h)(n

SNAP에 Scratch처럼 추가 할 수있는 컬렉션 / 쇼케이스가 있습니까? 실행 가능한 버전에 직접 연결하는 것이 편리한 IMO입니다.
Geobits

예. 내 프로젝트에 대한 링크를 추가했습니다. 좋은 생각. :)
Scimonster 2016

그것은 무시합니까 -1에서 indexOf? 지금은 문자열에없는 경우처럼 보인다, 미디 번호 47을 수행합니다.
Maltysen

@ Maltysen 질문은 적절한 범위를 벗어난 입력과 관련하여 결코 말하지 않습니다.
Scimonster

진실. 나는 그것을 무시하려고 의도했지만 충분히 구체적이지 않은 것에 대한 내 잘못을 추측하기 때문에 그것을 허용 할 것입니다.
Maltysen

4

매스 매 티카, 219-50-75-50 = 44

c=CharacterRange;d=Import;EmitSound[Function[b,Sound[Split@Characters@d@b/.a:{__String}:>SoundNote[StringPosition[c["A","Z"]<>" ()-,;.'\""<>c["a","z"],a[[1]]][[1,1]]+#3-12,60Length@a/#2],{0,60StringLength@d@b/#2}]]/@#]&

입력 파일, BPM 및 반 걸음 수 목록을 입력으로 가져 와서 소리를 재생합니다 (피아노에서 다른 악기는 더 많은 바이트를 사용함). 나쁘게 들리지 않습니다!


1

자바 스크립트 (ES6) 377-50-50-75 = 202

먼저, <input>파일 읽기 대신 필드 를 사용하는 실행 가능한 스 니펫이 있습니다.

<b>BMP:</b> <input id="bpm" size=3 placeholder="BMP" value="120"> <b>Transpose:</b> <input size=3 id="transpose" placeholder="Transpose" value="0"><br/><br/><div id="tracks" style="float:left;padding-right:5px;"><input placeholder="Track" class="track"></div><button id="add">Add Additional Track</button><div style="clear:both; padding-top:5px;"></div><button id="play"><b>Play</b></button><script>f=function(s,b,z){C=new (window.AudioContext||window.webkitAudioContext);b=6e4/b;s.map(function(p){var o=C.createOscillator(t=setTimeout);o.connect(C.destination);o.start();p.split("").map(function(c,i){t(function(){o.frequency.value=440*Math.pow(2, ("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12)},b*i)});t(function(){o.stop()},p.length*b)})};document.getElementById("play").onclick=function(){f([].map.call(document.getElementsByClassName("track"),function(e){return e.value;}),+document.getElementById("bpm").value,+document.getElementById("transpose").value);};document.getElementById("add").onclick=function(){var i=document.createElement("input");i.placeholder="Track";i.className="track";document.getElementById("tracks").appendChild(document.createElement("br"));document.getElementById("tracks").appendChild(i);};</script>

그리고 이제 실제 항목 :

f=(n,b,z)=>{C=new AudioContext;b=6e4/b;s=n.map(m=>(x=new XMLHttpRequest,x.open("GET",m,0),x.send(),x.responseText));s.map(p=>{var o=C.createOscillator(t=setTimeout);o.connect(C.destination);o.start();[...p].map((c,i)=>t(_=>o.frequency.value=440*Math.pow(2,("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12),b*i)),t(_=>o.stop(),p.length*b)})}

세 개의 인수는 동시에 재생되는 파일 경로 문자열, 분당 음표 및 모든 입력을 조옮김하는 반 단계 수의 배열입니다.

공백과 주석으로 :

f=(n,b,z)=>{
    C=new AudioContext;
    b=6e4/b;

    // fill s with the contents of each file
    s = n.map(m=>(x=new XMLHttpRequest,x.open("GET",m,0),x.send(),x.responseText));

    // play each track
    s.map(p=>{
        var o=C.createOscillator(t=setTimeout);
        o.connect(C.destination);
        o.start();

        // queue up each note with setTimeout
        [...p].map((c,i)=>
            t(_=>
                o.frequency.value=440*
                    Math.pow(2,
                            ("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12
                    ),
             b*i)
        );
        // queue up termination of those track
        t(_=>o.stop(),p.length*b)})
}

f(["file:///home/users/apsillers/notes.txt",
   "file:///home/users/apsillers/notes2.txt"],
  240, 5)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.