"탭"재생


31

현재 2015 년 11 월 11 일은 미국 재향 군인의 날 입니다. " Taps "는 미군 장례식에서 연주 되는 나팔 소리입니다 .

( vtmiller의 SoundCloud 에서 "탭" )

단지 24 개의 음표 만 있고 4 개의 다른 음표 만 사용하는 단순한 멜로디입니다. 악보는 다음과 같습니다.

악보를 두 드린다 ( 소스 )

도전

"Taps"를 재생하거나 "Taps"의 오디오 파일을 일반적인 오디오 파일 형식 (예 : MP3, WAV, MIDI)으로 출력하는 프로그램 또는 기능을 작성하십시오. 언어에 따라 사용 가능한 모든 종류의 악기 또는 비프 음을 사용하여 모든 키로 연주 할 수 있습니다. 예를 들어, 나팔 대신 피아노처럼 들릴 수 있습니다. (여전히 하나의 계측기 유형 만 사용해야합니다.)

24 개의 모든 음은 정확한 피치, 지속 시간 및 간격으로 연주되어야합니다. "탭"에 익숙한 사람은 코드를 실행하고 재생중인 노래를 쉽게 인식 할 수 있어야합니다.

멜로디의 지속 시간 (첫 번째 음표의 시작부터 마지막 ​​음표의 끝까지)은 30 초에서 70 초 사이 여야합니다. 선택적으로 사운드 파일의 시작 및 / 또는 끝을 채우는 최대 5 초의 침묵이있을 수 있으므로 80 초 파일이 가장 오래 허용됩니다.

물론 노래를 온라인 어딘가에서 다운로드하거나 샘플로 가져 오는 오디오 라이브러리에서 추출 할 수는 없습니다. 그러나 개별 음을 연주 / 작곡하고 오디오 파일을 생성 할 수있는 오디오 라이브러리를 사용할 수 있습니다.

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다. 그러나이 특별한 도전에 대해서는 특히 음질을 희생하여 바이트 수에 집중하지 않는 것이 좋습니다. 제출물을 골라 내지 만 악기 선택이나 사운드 출력 방법으로 창의력을 발휘할 수 있습니다. 이 도전은 간신히 알아볼 수있는 "탭"버전을 긁어내는 것이 아니라 참전 용사를 기리는 것입니다.

빈 줄에 링크를 붙여 넣기 만하면 SoundCloud 오디오 파일 을 게시물직접 포함시킬 수 있습니다 . SoundCloud 계정이 있으면 출력을 공유 할 수있는 좋은 방법입니다.


ChucK를 생각하고 있습니다.
The_Basset_Hound 20시 27 분

4
캘빈, 괜찮으 시다면 구식 베이직에 몇 가지 골프 답변을 게시하고 PPCG 이외의 재향 군인 자선 단체에 기부하겠습니다. 당신은 저에게 영감을주었습니다. 영국의 BTW에는 11 월 둘째 주 일요일 인 Remembrance Sunday가 있습니다. 이는 올해가 마지막 일요일임을 의미합니다. 가장 초기의 추억 중 하나는 2 분의 침묵이 관찰 된 양귀비로 둘러싸인 기념비 옆에 서 있습니다. 나는 약 3 살이었다. 어머니에게 아무도 이야기하지 않은 이유를 물었을 때 조용히하라고 말했다.
레벨 리버 St

페르마타의 길이에 대한 규칙이 있습니까?
SirPython

@SirPython 나는 그 상징이 무엇을 의미하는지조차 몰랐다! en.wikipedia.org/wiki/Fermata 에 따르면 "얼마나 오래 걸리는지 는 연주자의 재량에 달려 있습니다." 출력에 재량을 사용하는 것은 실제로 codegolf와 맞지 않으므로 서면으로 연주했습니다. 나는 당신이 어디로 가고 있는지 보았습니다 ... 점선으로 된 두 번째 음표를 길게하면 점선으로 된 여덟 번째 음표가 16 분 음표로 압축되어 일이 더 간단 해집니다. 그러나 나는 그것이 속이는 것 같아 :-)
Level River St

답변:


4

qb64, 100 84 바이트

http://www.qb64.net/ 에서 다운로드 할 수있는 이전 Qbasic의 업데이트 버전

카운트는 공백을 제외하며, 필요하지 않으며 명확성을 위해 데이터를 3 음표로 분리해야합니다.

PLAY"T99L4C.L8CL1F. L4C.L8FL1A. L4CFL2A L4CFL2A L4CFL1A. L4F.L8AL1>C< L2AFL1C. L4C.L8CL1F."

재생 문자열의 명령

T99     set tempo to 99 quarter notes per minute (default is 120, only just too short)
CDEFGAB play notes in the current octave
><      up or down one octave
Lx      following notes are of note of 1/x duration
.       extend previous note duration by 50%

골프 기록 :

첫 번째 게시물 : 4/4 시간에서 4/2 시간으로, 전체 노트가 있지만 16 번째 노트는 없습니다.

편집 1 : 키가 C (범위 GG)에서 F (범위 CC)로 변경되었습니다. 이제 이전과 같이 모든 낮은 G보다 한 번만 발생하는 높은 C에 대해 한 번만 옥타브 변경을 수행하면됩니다.

옥타브 변화를 모두 없애 버린 골프는 더 이상 없다고 생각합니다. 총 20 개가 L있지만 피할 수있는 확실한 방법은 없습니다.

마지막 문구 (11 자)는 첫 번째 문구와 동일하지만 11 자 미만으로 두 번 삽입 할 수는 없습니다. 이니셜 L4이 제거 된 경우 반복 된 데이터는 9 자 입니다.


9

자바 스크립트, 203 198 196 195 바이트

with(new AudioContext)for(t=i=0;n="301093301396202346202346202396331699464390301093"[i++];)with(createOscillator())i%2?l=n/2:(frequency.value=392+n*44,connect(destination),start(t+.1),stop(t+=l))

Dendrobium 덕분에 5 바이트가 절약 되었고 @PatrickRoberts 덕분에 1 바이트가 절약 되었습니다.

설명

with(new AudioContext)        // use HTML5 audio
  for(                        // iterate through the note pitches and lengths
    t=i=0;                    // t = current time to place the note
    n=                        // n = note pitch (or temporarily length)

    // This string contains the values of each note alternating between length and pitch
    //     (l1, p1, l2, p2, etc...)
    // Length value is in 16th notes (1 = 1/16th note, 2 = 1/8th, etc...)
    //     The longer notes are limited to 9 but I think it still sounds OK
    // Pitch value 0 = G4, 3 = C5, 6 = E5, 9 = G5 (multiples of 3 saves 1 byte)
    "301093301396202346202346202396331699464390301093"

  [i++];)
    with(createOscillator())  // create the note oscillator
      i%2?                    // alternate between length and pitch characters
        l=n/2                 // l = length (stored for use in the next iteration)
                              // dividing it by 2 sets the speed to 60 beats per minute
                              //     and casts it to a number
      :(
        frequency.value=392   // base note = G5 (392hz)
          +n*44,              // there is (conveniently) roughly 132hz between each note
        connect(destination), // send the note's sound through the speakers
        start(t               // schedule the note to sound
          +.1),               // short delay to distinguish two notes of the same pitch
        stop(t+=l)            // schedule the end of the note and increment the time
      )

브라우저에서 여기에서 테스트하십시오! HTML5 Web Audio API를 지원하는 모든 브라우저 에서 작동 합니다 .


1
-5 바이트 : c = new AudioContext (); for (t = i = 0; n = "301093301396202346202346202396331699464390301093"[i ++];) with (c.createOscillator ()) i % 2? l = n / 2 :( 주파수. value = 392 + n * 44, connect (c.destination), start (t + .1), stop (t + = l))
Dendrobium

지속 시간 (12 단위를 9로 변경)이 정확하지 않다고 말하고 싶습니다. 점선으로 된 반쪽 음표에는 페르마타가 있으며 실제로 12 이상 이어야한다는 사실로 인해 악화되었습니다 .
lirtosiast 5

@ThomasKwa 그래, 완벽하지는 않지만, 요구 사항을 쉽게 알아볼 수 있어야 통과 할 수 있습니다. (또한 질문에서 SoundCloud 트랙을 듣습니다. 첫 번째 반음은 정확히 10/16입니다. 따라서 해당 버전으로 가면 꽤 가깝습니다! : P)
user81655

8

Mathematica, 361 287 285 바이트

나는 정확성을 위해 여기에 갔다. 출력은 트럼펫과 함께 연주 된 스코어에 설명 된 것과 정확히 같습니다. 여기 에서 파일을 찾을 수 있습니다 .

"G"
e="E5";c="C5";EmitSound@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{%,8,17,%,24,20,c,2,23,%,8,26,c,24,29,e,2,32,%,12,35,c,12,38,e,6,41,%,12,44,c,12,47,e,6,50,%,12,53,c,12,56,e,2,59,c,8,62,e,24,65,"G5",3,68,e,6,170/3,c,6,136/3,%,2,34,%,8,34,%,24,34,c,2,34}~Partition~3]

골프 제안에 대한 @ MartinBüttner에게 감사합니다.


4
링크를 통해 노래를들을 수 없습니다. 권한으로 인해 제거되었거나 청취 할 수없는 것 같습니다.
d0nut

2
여분의 pedantic하기 위해, 당신은 fermatas를 설명하지 않았습니다!
wchargin

"멜로디의 지속 시간은 30 초에서 70 초 사이 여야합니다." 이것은 24 초에 약간 짧습니다.
Calvin 's Hobbies

4
@ Calvin'sHobbies Wait ... 권장 된 50 BPM에서이 모든 작업을 수행하고 있습니다 ... 나는 당신을 비난합니다. |
LegionMammal978

1
%1, %2그리고 %%하지 어떤 이상 바이트 실제로 저장 x="E5"-> x(당신이 변수를 사용하여 꽤 많은 저장 실제로 당신이해야 사용할 얼마나 자주보고, 사실). 그런 다음 EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}에 가장 많이 사용하는 메모를 사용 하고 저장하여 많은 양 의 바이트를 저장할 수 있습니다 %. 그리고 24 개의 메모에서 여전히 간단한 목록을 분할하는 것이 더 짧을 수 있습니다.SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Martin Ender

5

소닉 파이, 899 바이트

타이밍이 약간 늦었지만 괜찮습니다.

가볍게 골프를 타다 :

use_synth : 블레이드
use_synth_defaults 지속 : 0.70, 릴리스 : 0.0
놀이 : G4, 출시 : 0.05
기다리다 0.75
놀이 : G4, 유지 : 0.25
0.25 기다려
hold = rrand_i (3,4)
놀이 : C5, 유지 : 보류, 릴리스 : 0.5
대기 +0.5
놀이 : G4, 출시 : 0.05
기다리다 0.75
놀이 : C5, 유지 : 0.25
수면 0.25
hold = rrand_i (3,4)
놀이 : E5, 지속 : 보류, 해제 : 1.25
수면 +1.25
놀이 : G4
수면 0.70
놀이 : C5
수면 0.70
2. 시간
  놀이 : E5, 유지 : 1, 릴리스 : 0.25
  수면 1.25
  놀이 : G4
  수면 0.7
  놀이 : C5
  수면 0.7
종료
hold = rrand_i (3,5)
놀이 : E5, 지속 : 보류, 해제 : 0.75
수면 +1
놀이 : C5, 출시 : 0.05
수면 0.75
놀이 : E5, 유지 : 0.25
수면 0.25
놀이 : G5, 유지 : 2.45, 출시 : 0.05
수면 2.5
놀이 : E5, 유지 : 1, 릴리스 : 0.25
수면 1.25
놀이 : C5, 유지 : 1, 릴리스 : 0.25
수면 1.25
hold = rrand_i (3,5)
놀이 : G4의 유지 : 파악, 방출 : 0.5
수면 +0.5
놀이 : G4, 출시 : 0.05
수면 0.75
놀이 : G4, 유지 : 0.25
수면 0.25
hold = rrand_i (3,5)
놀이 : C5, 유지 : 보류, 릴리스 : 1.5

예, 누군가 Sonic Pi를 사용하고 있습니다!
Mega Man

h :로 이름 바꾸기 보류를 변경하고 release : 0.0을 release : 0으로 변경하고 공백을 제거하면 약간 골퍼 될 수 있습니다.
Mega Man

4

MATLAB, 338 327 262 258 230 바이트

o=@(L,f)sin(pi*.11*2^(f/12))*(1:600*L))
sound([o(3,-1) o(1,-1) o(12,2) o(3,-1) o(1,2) o(12,4) o(2,-1) o(2,2) o(4,4) o(2,-1) o(2,2) o(4,4) o(2,-1) o(2,2) o(12,4) o(3,2) o(1,4) o(8,6) o(4,4) o(4,2) o(12,-1) o(3,-1) o(1,-1) o(12,4)])

2

SmileBASIC, 73 바이트

BGMPLAY"@56T50L2.G8.G16B+G8.<C16E>[G8<C8E4>]2G8<C8EC8.E16G2E4C4>GG8.G16B+

모든 메모와 타이밍이 정확합니다. MIDI에서 가장 가까운 트럼펫을 사용했습니다.

<audio autoplay controls src="//12me21.github.io/resources/taps.mp3"></audio>


1

파워 쉘, 183 (175) 159 바이트

비프 음을 좋아하지 않는 향수 여행?!

foreach($i in 0..23){[console]::beep((196,262,330,392)[(001012012012012123210001-split'')[$i]],(3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12)[$i]*400)}


설명 (정렬)

foreach($i in 0..23) { # foreach loop which ranges from 0 to 23
    [console]::beep( # [console]::beep(Pitch, Duration)
        (196,262,330,392) # the notes in Hertz
            [ # select which note to use
                (001012012012012123210001-split'') # -split '' creates an array of [0,0,1,0,1 ...], spaces can be omitted
                [$i] # select the n-th element
            ],
        (3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12) # array of durations
        [$i]*400 # duration in milliseconds * 400
    )
}


약 45 초 후에 재생됩니다.

Windows 'Powershell을 사용한 것은 이번이 처음입니다. 골프를 치는 데 도움이되는 팁은 정말 좋습니다.


이전 버전

175

foreach($i in(0..23)){[console]::beep((196,262,330,392)[(0,0,1,0,1,2,0,1,2,0,1,2,0,1,2,1,2,3,2,1,0,0,0,1)[$i]],(3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12)[$i]*400)}

183

$d=3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12;$n=0,0,1,0,1,2,0,1,2,0,1,2,0,1,2,1,2,3,2,1,0,0,0,1;foreach($i in(0..23)){[console]::beep((196,262,330,392)[$n[$i]],$d[$i]*400)}

1

BBC 기본, 111

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html 에서 통역사 다운로드

필수 요소가 아니며 가독성을 위해 추가 된 공백 및 줄 바꿈은 점수에 포함되지 않습니다

FORk=1TO24
  x=ASC(MID$("')F'Lb(Ke(Ke(KbJhxeI#')F",k))
  SOUND1,-9,x DIV7*4+60,INT(12/1.4^(x MOD7))*5
  SOUND1,0,1,1
NEXT

상당히 표준 압축, 노트 당 1 ASCII 문자. 매개 변수는 SOUND다음과 같습니다.

Channel (always 1 for the purposes of this challenge)
Amplitude (negative for on, 0 for off, positive is an envelope index)
Pitch (in increments of 1/4 semitone, with middle C at 100)
Duration (20ths of a second)

4 개만 사용하더라도 노래의 범위는 13 음입니다. 이 범위를 인쇄 가능한 ASCII의 95- 숫자 범위로 가져 오려면 지속 시간을 7의 정수 범위로 압축하고 모듈로 7을 가져와야합니다. 사용) : 1,2,3,4,6,8,12. 이 숫자를 만들기 위해 12를 sqrt(2)(1.4로 근사한) 거듭 제곱으로 나누고 잘리는 아이디어에 부딪쳤다 .

SOUND1,0,1,112 바이트 비용, 성가심이다. 동일한 피치의 음 사이에 일시 정지를 제공해야합니다.


1

루비 + 경고음, 178 바이트

f=[260,346,416,499]
n=[12,*1..4]
l=(a="001012012012012123210001310310224224220318440310".chars.map(&:to_i))[24..-1]
`beep#{24.times.map{|i|" -f#{f[a[i]]} -l#{n[l[i]]}00"}*" -n"}`

이것을 만들기 위해 잠시 걸렸지 만 보트를 놓친 것 같습니다.

f사용 된 4 개의 주파수를 유지합니다. n사용 된 5 개의 음 길이를 16 음의 배수로 유지합니다.

a="00101...는 모든 노트 피치와 모든 노트 길이를 각 배열에 대한 인덱스로 유지합니다. l그런 다음 24 번째 indice 이상으로 설정됩니다 a. 그런 다음 위의 모든 과정을 반복하여 경고음 명령을 구성하고 실행합니다.


0

C-(원시 : 318 | WAV : 437)

44800Hz, 33.60 초에서 8 비트 (서명되지 않은) 모노 PCM

메조 포르테, 포르티시모 및 포르테 역학은 다소 예술적으로 구현됩니다. 페르마타가 더 나을 수 있습니다.

코드 unsigned long long는 8 옥텟과 시스템 리틀 엔디안 에 의존합니다 .

#include<stdio.h>
#include<math.h>
#ifdef RAW
main(){unsigned long long D[]={0x422422c13c13,0xc13c44813c22},X[]={27863,37193,46860,55727},O=0x406e64924910,i=0,j;float Z,A,U=40,P;for(;i<24;D[i++/12]>>=4){Z=X[O&3]/1e6;P=0;O>>=2;A=i>18?--U:i<14?U+i/2:U+30;for(j=(D[i/12]&15)*13440;j;A-=--j<7e3&&A>0?.01:0)putchar(A*sin(P+=Z)+128);}}
#else
main(){unsigned long long D[]={0x422422c13c13,0xc13c44813c22},X[]={27863,37193,46860,55727},O=0x406e64924910,i=0,j;float Z,A,U=40,P;int W[]={0x46464952,1570852,0x45564157,544501094,16,65537,44800,44800,524289,0x61746164,1505280};fwrite(W,4,11,stdout);for(;i<24;D[i++/12]>>=4){Z=X[O&3]/1e6;P=0;O>>=2;A=i>18?--U:i<14?U+i/2:U+30;for(j=(D[i/12]&15)*13440;j;A-=--j<7e3&&A>0?.01:0)putchar(A*sin(P+=Z)+128);}}
#endif

다음과 같이 컴파일하고 실행하십시오.

gcc -std=c99 -o taps taps.c -lm
./taps > taps.wav
play taps.wav

-DRAW원시 변형의 컴파일 라인에 추가하십시오 .

원시 출력은 SoX와 함께 다음과 play같이 재생할 수 있습니다 .

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.