「タップ」をプレイする


31

今日、2015年11月11日は米国退役軍人の日です。「タップ」は、米軍葬儀で行われるラッパ呼び出しです。

vtmillerからSoundCloudの「タップ」

これは単純なメロディで、長さはわずか24音で、使用する音は4種類のみです。楽譜は次のとおりです。

Taps sheet music ソース

チャレンジ

「タップ」を再生するか、「タップ」のオーディオファイルを一般的なオーディオファイル形式(MP3、WAV、MIDIなど)で出力するプログラムまたは関数を作成します。それは、あなたの言語で利用可能なあらゆる種類の楽器またはビープ音を使用して、どのキーでも演奏できます。たとえば、ラッパの代わりにピアノのように聞こえるかもしれません。(ただし、使用する楽器の種類は1つだけです。)

24音すべてを正確なピッチ、デュレーション、間隔で演奏する必要があります。「タップ」に精通している人は、コードを実行して、再生中の曲を簡単に認識できるはずです。

メロディの長さ(最初の音の開始から最後の音の終わりまで)は30〜70秒でなければなりません。オプションで、サウンドファイルの開始または終了、あるいはその両方に最大5秒の無音パディングを設定できるため、80秒のファイルが許可されます。

もちろん、単にどこかでオンラインで曲をダウンロードしたり、たまたまサンプルとして持っているオーディオライブラリから抽出したりすることはできません。ただし、個々のノートを再生/作成し、オーディオファイルを作成できるオーディオライブラリを使用できます。

得点

これはであるため、バイト単位の最短回答が優先されます。ただし、この特定の課題については、特に音質を犠牲にして、バイトカウントに集中しないことをお勧めします。提出物をゴルフしますが、楽器の選択や音の出力方法で創造性を発揮できます。この課題は退屈な退役軍人を称えることであって、「タップ」のほとんど認識できないバージョンを叫ぶことではありません。

空行にリンクを貼り付けるだけで、SoundCloudオーディオファイルを投稿に直接埋め込むことができます。SoundCloudアカウントをお持ちの場合、これは出力を共有するのに最適な方法です。


私はChucKを考えています。
The_Basset_Hound

4
カルビン、気にしない場合は、古いBASICにゴルフの答えをいくつか投稿し、PPCG以外の退役軍人への寄付を行います。あなたは私にそうするよう促しました。英国では、11月の第2日曜日であるRemembrance Sundayがあります。つまり、今年は最後の日曜日でした。私の最も初期の思い出の1つは、2分間の沈黙が観察されたポピーに囲まれた記念碑のそばに立っていることです。私は約3歳でした。母に誰も話していなかったのかと尋ねると、彼女は静かになるように言いました。
レベルリバーセント

フェルマータの長さに規則はありますか?
SirPython

@SirPythonそのシンボルの意味すら知りませんでした!en.wikipedia.org/wiki/Fermataによれば、「どれだけ長く保持されるかは、実行者の裁量による。」出力に慎重さを使用することはcodegolfに実際には適合しないため、書かれたとおりに再生しました。しかし、点線の2分音符を長くすると、点線の8分音符が16分音符に圧縮され、物事が簡単になります。しかし、私はそれが浮気だと思う:-)
レベルリバーセント

回答:


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に対して、オクターブ変更を1回実行するだけで済みます。

これらのオクターブの変更をすべて取り除いたので、ゴルフにはこれ以上はないと思います。合計20個ありますがL、それらを回避する明確な方法はありません。

最後のフレーズ(11文字)は最初のフレーズと同じですが、11文字未満で2回挿入する方法はありません。イニシャルL4を削除すると、繰り返されるデータは9文字になります(デフォルトのノートの長さは4分音符のように見えるので、不要に見えますが、文書化されていないので残しました。)


9

JavaScriptの、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ウェブオーディオAPIをサポートする任意のブラウザ


1
-5バイト:c = new AudioContext(); for(t = i = 0; n = "301093301396202346202346202396331699464390301093" [i ++];)with(c.createOscillator())i%2?l = n / 2:(frequency。値= 392 + n * 44、connect(c.destination)、start(t + .1)、stop(t + = l))
デンドロビウム

期間(12単位を9に変更)は不正確だと思います。それは、点線の半分ノートはそれらの上にフェルマータを持っており、実際に12またはあるべきという事実によって悪化させています長いです
リトシアスト

@ThomasKwaええ、それは完璧ではありませんが、要件は簡単に認識できるようにすることですので、合格すると言います。(質問のSoundCloudトラックも聞いてください。最初の点線の半音は正確に10/16分の1なので、そのバージョンで行けばかなり近いです!: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
余分な知識を得るために、フェルマータを説明しませんでした!
wchargin

「メロディの持続時間は30〜70秒でなければなりません。」これは24秒で少し短いです。
カルビンの趣味

4
@ Calvin'sHobbiesお待ちください...私はこれをすべて推奨される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
マーティン・エンダー

5

Sonic Pi、899バイト

タイミングは少しずれていますが、大丈夫だと思います。

軽くゴルフ:

use_synth:blade
use_synth_defaultssustain:0.70、release:0.0
プレイ:G4、リリース:0.05
0.75待つ
play:G4、sustain:0.25
0.25待つ
hold = rrand_i(3,4)
play:C5、sustain:hold、release:0.5
ホールド+0.5
プレイ:G4、リリース:0.05
0.75待つ
再生:C5、維持:0.25
睡眠0.25
hold = rrand_i(3,4)
play:E5、sustain:hold、release:1.25
スリープホールド+1.25
遊び:G4
睡眠0.70
遊び:C5
睡眠0.70
2.times do
  play:E5、sustain:1、release:0.25
  睡眠1.25
  遊び:G4
  睡眠0.7
  play:C5
  sleep 0.7
end
hold=rrand_i(3,5)
play:E5,sustain:hold,release:0.75
sleep hold+1
play:C5,release:0.05
sleep 0.75
play:E5,sustain:0.25
sleep 0.25
play:G5,sustain:2.45,release:0.05
sleep 2.5
play:E5,sustain:1,release:0.25
sleep 1.25
play:C5,sustain:1,release:0.25
sleep 1.25
hold=rrand_i(3,5)
play:G4,sustain:hold,release:0.5
sleep hold+0.5
play:G4,release:0.05
sleep 0.75
play:G4,sustain:0.25
sleep 0.25
hold=rrand_i(3,5)
play:C5,sustain:hold,release:1.5

Yeah, someone using Sonic Pi!
Mega Man

Could be slightly golfed through renaming hold with h, changing release:0.0 to release:0 and removing the spaces.
Mega Man

4

MATLAB, 338 327 262 258 230 bytes

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 bytes

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

All the notes and timings are correct. I used a trumpet because it's the closest thing in MIDI

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


1

Powershell, 183 175 159 bytes

Nostalgia trip, who doesn't like beeps?!

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)}


Explanation (sortof)

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
    )
}


This will play in about 45 seconds.

This is my first time using Windows' Powershell, any tips on golfing this are welome.


Old versions

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 Basic, 111

Download interpreter at http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Score excludes whitespace and newlines, which are non-essential and added for readability

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

Fairly standard compression, 1 ASCII character per note. Parameters of SOUND are as follows:

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)

The range of the song is 13 notes, even though only 4 are used. To get this range into the 95-number range of printable ASCII, I had to squeeze the duration into an integer range of 7 and take it modulo 7. The following durations (in sixteenths) are used (with the exception of 6 which is never used): 1,2,3,4,6,8,12. To produce these numbers, I hit upon the idea of dividing 12 by a power of sqrt(2) (approximated by 1.4) and truncating.

The SOUND1,0,1,1 is an annoyance, costing 12 bytes. It's necessary to provide a pause between notes of identical pitch.


1

Ruby + beep, 178 bytes

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"}`

Took me awhile to make this, I think I missed the boat, but whatever.

f holds the four frequencies used. n holds the five note lengths used, in multiples of 16th notes.

a="00101... holds all the note pitchs followed by all the note lengths, as indexes into the respective arrays. l is then set to the 24th indice and onward of a. Then a beep command is constructed by iterating through all of the above, and executed


0

C - (Raw: 318 | WAV: 437)

8-bit (unsigned) mono PCM at 44800 Hz, 33.60 seconds.

The mezzo forte, fortissimo and forte dynamics are somewhat artistically implemented. The fermatas could be better.

Code relies on unsigned long long being 8 octets and system little endian.

#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

Compile and run with something like:

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

Add -DRAW to compile-line for raw variant.

Raw output can be played with e.g. SoX play as:

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.