Jouer "Taps"


31

Aujourd'hui, le 11 novembre 2015, c'est la Journée des anciens combattants aux États-Unis. " Taps " est le clairon joué lors des funérailles militaires américaines:

( "Taps" sur SoundCloud de vtmiller )

C'est une mélodie simple, longue de vingt-quatre notes seulement et utilisant seulement quatre notes différentes. Voici la partition:

Partitions de Taps ( source )

Défi

Écrivez un programme ou une fonction qui lit des "Taps" ou sort un fichier audio de "Taps" dans n'importe quel format de fichier audio courant (par exemple MP3, WAV, MIDI). Il peut être joué dans n'importe quelle touche, en utilisant n'importe quel type d'instrument ou de bip disponible dans votre langue. Par exemple, cela pourrait ressembler à un piano au lieu d'un clairon. (Même si un seul type d'instrument doit être utilisé.)

Les vingt-quatre notes doivent être jouées avec une hauteur, une durée et un espacement précis. Quelqu'un qui connaît "Taps" devrait être en mesure d'exécuter votre code et de reconnaître facilement la chanson en cours de lecture.

La durée de la mélodie (du début de la première note à la fin de la dernière note) doit être comprise entre 30 et 70 secondes. Vous pouvez éventuellement avoir jusqu'à 5 secondes de silence pour remplir le début et / ou la fin de votre fichier son, donc un fichier de 80 secondes est le plus long autorisé.

Bien sûr, vous ne pouvez pas simplement télécharger la chanson en ligne quelque part ou l'extraire d'une bibliothèque audio qui se trouve l'avoir comme échantillon. Vous pouvez cependant utiliser des bibliothèques audio qui peuvent jouer / composer des notes individuelles et créer des fichiers audio.

Notation

Il s'agit de , donc la réponse la plus courte en octets l'emporte. Cependant, pour ce défi particulier, je vous encourage à ne pas vous concentrer sur votre nombre d'octets, surtout au détriment de la qualité sonore. Jouez vos soumissions, mais laissez-vous créatif avec votre choix d'instruments ou votre méthodologie de sortie sonore. Ce défi vise à honorer les vétérans, pas à crier une version à peine reconnaissable de "Taps".

Notez que vous pouvez incorporer des fichiers audio SoundCloud directement dans des publications en collant simplement le lien sur une ligne vide. Si vous avez un compte SoundCloud, ce serait un excellent moyen de partager votre sortie.


Je pense à ChucK.
The_Basset_Hound

4
Calvin, si cela ne vous dérange pas, je posterai quelques réponses de golf dans d'anciens BASIC et ferai un don à une organisation caritative des anciens combattants à l'extérieur de PPCG. Vous m'avez inspiré à le faire. BTW au Royaume-Uni, nous avons le dimanche du Souvenir, le deuxième dimanche de novembre, ce qui signifie que cette année c'était dimanche dernier. Un de mes premiers souvenirs est debout près d'un monument entouré de coquelicots où 2 minutes de silence ont été observées. J'avais environ 3 ans. Quand j'ai demandé à ma mère pourquoi personne ne parlait, elle m'a dit de me taire.
Level River St

Y a-t-il des règles pour les longueurs des fermatas?
SirPython

@SirPython Je ne savais même pas ce que ce symbole voulait dire! Selon en.wikipedia.org/wiki/Fermata "La durée exacte de sa détention est à la discrétion de l'artiste." Utiliser la discrétion sur la sortie ne correspond pas vraiment au codegolf, donc je l'ai joué tel qu'écrit. Je vois où vous allez bien ... L'allongement de la deuxième note pointée pourrait compresser la croche pointée jusqu'à une double croche, ce qui rend les choses plus simples. Mais je pense que c'est de la triche :-)
Level River St

Réponses:


4

qb64, 100 84 octets

Version mise à jour de l'ancien Qbasic, téléchargeable sur http://www.qb64.net/

Count exclut les espaces, qui ne sont pas nécessaires et uniquement là pour diviser les données en phrases de trois notes pour plus de clarté.

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

Commandes dans la chaîne de lecture

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%

Histoire du golf:

Premier post: 4/4 fois à 4/2 fois, ce qui signifie que j'ai des notes entières, mais pas de doubles croches.

Édition 1: la clé est passée de C (plage GG) à F (plage CC). Maintenant, je n'ai plus qu'à effectuer un changement d'octave une fois, pour le Do élevé, qui ne se produit qu'une seule fois, plutôt que tous les G faibles comme auparavant.

Après avoir éliminé tous ces changements d'octave, je ne pense pas qu'il y ait plus de golf. Il y a un total de 20 L, mais il n'y a aucun moyen évident de les éviter.

La dernière phrase (11 caractères) est la même que la première, mais il n'y a aucun moyen de l'insérer deux fois en moins de 11 caractères. Les données répétées ne compteraient que 9 caractères si les initiales L4étaient éliminées (cela semble inutile car la longueur de note par défaut semble être une noire, mais elle n'est pas documentée, je l'ai donc laissée dedans.)


9

JavaScript, 203 198 196 195 octets

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

5 octets enregistrés grâce à Dendrobium et 1 grâce à @PatrickRoberts.

Explication

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
      )

Testez-le ici dans le navigateur! Fonctionne sur tout navigateur prenant en charge l'API HTML5 Web Audio .


1
-5 octets: c = nouveau AudioContext (); pour (t = i = 0; n = "301093301396202346202346202396331699464390301093" [i ++];) avec (c.createOscillator ()) i% 2? L = n / 2: (fréquence. valeur = 392 + n * 44, connecter (c. destination), démarrer (t + .1), arrêter (t + = l))
Dendrobium

Je dirais que la durée (changer 12 unités en 9) est imprécise; il est aggravé par le fait que les demi-notes en pointillés ont des fermatas sur elles et devraient vraiment être 12 ou plus .
lirtosiast

@ThomasKwa Oui, ce n'est pas parfait, mais l'exigence est d'être facilement reconnaissable donc je dirais que ça passe. (Écoutez également la piste SoundCloud dans la question, la première demi-note en pointillés est exactement 10/16, donc si nous utilisons cette version, elle est assez proche!: P)
user81655

8

Mathematica, 361 287 285 octets

Je suis allé pour l'exactitude ici. La sortie est exactement celle décrite dans la partition, jouée avec la trompette. Vous pouvez trouver le fichier ici .

"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]

Merci à @ MartinBüttner pour ses suggestions de golf.


4
Link ne me permet pas d'entendre la chanson. Il semble être supprimé ou indisponible pour l'écoute en raison des autorisations.
d0nut

2
Pour être plus pédant, vous n'avez pas tenu compte des fermatas!
wchargin

"La durée de la mélodie doit être comprise entre 30 et 70 secondes." C'est un peu court à 24 secondes.
Calvin's Hobbies

4
@ Calvin'sHobbies Attendez ... Je fais tout cela au 50 BPM recommandé ... Je vous en veux: |
LegionMammal978

1
%1, %2et %%n'enregistrez en fait aucun octet sur x="E5"-> x(en fait, vu la fréquence à laquelle vous les utilisez, vous devriez en fait économiser beaucoup en utilisant des variables). Ensuite, vous pouvez enregistrer des tonnes d'octets en utilisant EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}et en stockant la note la plus utilisée dans %. Et à 24 notes, il pourrait être encore plus court de partitionner une liste plate:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Martin Ender

5

Sonic Pi, 899 octets

Le timing est un peu décalé, mais je pense que ça va.

Légèrement golfé:

use_synth: blade
use_synth_defaults sustain: 0.70, release: 0.0
jouer: G4, sortie: 0,05
attendre 0,75
jouer: G4, soutenir: 0,25
attendre 0,25
hold = rrand_i (3,4)
jouer: C5, soutenir: maintenir, relâcher: 0,5
attente d'attente + 0,5
jouer: G4, sortie: 0,05
attendre 0,75
jouer: C5, soutenir: 0,25
dormir 0,25
hold = rrand_i (3,4)
jouer: E5, soutenir: maintenir, relâcher: 1,25
maintien en veille + 1,25
jouer: G4
dormir 0,70
jouer: C5
dormir 0,70
2. fois
  jouer: E5, soutenir: 1, relâcher: 0,25
  dormir 1,25
  jouer: G4
  dormir 0,7
  jouer: C5
  dormir 0,7
fin
hold = rrand_i (3,5)
jouer: E5, soutenir: maintenir, relâcher: 0,75
attente sommeil + 1
jouer: C5, libérer: 0.05
dormir 0,75
jouer: E5, soutenir: 0,25
dormir 0,25
jouer: G5, soutenir: 2,45, relâcher: 0,05
dormir 2,5
jouer: E5, soutenir: 1, relâcher: 0,25
dormir 1,25
jouer: C5, soutenir: 1, relâcher: 0,25
dormir 1,25
hold = rrand_i (3,5)
jouer: G4, soutenir: maintenir, relâcher: 0,5
maintien en veille + 0,5
jouer: G4, sortie: 0,05
dormir 0,75
jouer: G4, soutenir: 0,25
dormir 0,25
hold = rrand_i (3,5)
jouer: C5, soutenir: maintenir, relâcher: 1.5

Oui, quelqu'un utilise Sonic Pi!
Mega Man

Pourrait être légèrement joué au golf en renommant la prise avec h, en changeant la version: 0.0 en la version: 0 et en supprimant les espaces.
Mega Man

4

MATLAB, 338 327 262 258 230 octets

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 octets

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

Toutes les notes et les horaires sont corrects. J'ai utilisé une trompette parce que c'est la chose la plus proche en MIDI

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


1

Powershell, 183 175 159 159 octets

Voyage de nostalgie, qui n'aime pas les bips?!

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


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


Cela se jouera dans environ 45 secondes.

C'est la première fois que j'utilise le PowerShell de Windows, tous les conseils sur le golf sont les bienvenus.


anciennes 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

Téléchargez l'interprète sur http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Le score exclut les espaces blancs et les nouvelles lignes, qui ne sont pas essentiels et ajoutés pour plus de lisibilité

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

Compression assez standard, 1 caractère ASCII par note. Les paramètres de SOUNDsont les suivants:

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)

La plage de la chanson est de 13 notes, même si seulement 4 sont utilisées. Pour obtenir cette plage dans la plage de 95 chiffres de l'ASCII imprimable, j'ai dû presser la durée dans une plage entière de 7 et la prendre modulo 7. Les durées suivantes (en seizièmes) sont utilisées (à l'exception de 6 qui n'est jamais utilisé): 1,2,3,4,6,8,12. Pour produire ces nombres, j'ai trouvé l'idée de diviser 12 par une puissance de sqrt(2)(approximée par 1,4) et de tronquer.

C'est SOUND1,0,1,1une nuisance, qui coûte 12 octets. Il faut prévoir une pause entre des notes de hauteur identique.


1

Ruby + bip, 178 octets

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

Cela m'a pris un certain temps pour faire cela, je pense que j'ai raté le bateau, mais peu importe.

fcontient les quatre fréquences utilisées. ncontient les cinq longueurs de note utilisées, en multiples de doubles croches.

a="00101...contient toutes les hauteurs de note suivies de toutes les longueurs de note, sous forme d'index dans les tableaux respectifs. lest ensuite réglé sur le 24e indice et à partir de a. Ensuite, une commande de bip est construite en itérant à travers tout ce qui précède, et exécutée


0

C - (Brut: 318 | WAV: 437)

PCM mono 8 bits (non signé) à 44800 Hz, 33,60 secondes.

Les dynamiques mezzo forte, fortissimo et forte sont quelque peu mises en œuvre artistiquement. Les fermatas pourraient être mieux.

Le code repose sur unsigned long long8 octets et un système peu 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

Compilez et exécutez avec quelque chose comme:

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

Ajouter -DRAWà la ligne de compilation pour la variante brute.

La sortie brute peut être jouée avec par exemple SoX playcomme:

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.