C'est le défi hebdomadaire n ° 1. Thème: Traitement audio
Votre tâche est d’écrire un programme, qui écrit un fichier audio sur un disque (dans un format de votre choix), qui contient le code Morse pour 2015
, c’est-à-dire
..--- ----- .---- .....
Vous êtes libre de choisir n'importe quel type de son pour les segments, comme une onde sinusoïdale à fréquence unique, un accord, du bruit, un instrument (par exemple, l'utilisation de fichiers MIDI), à condition que ce soit audible. Cependant, le calendrier est soumis à certaines contraintes:
- Les segments courts doivent durer au moins 0,2 seconde.
- Les segments longs doivent être au moins 3 fois plus longs que les segments courts.
- Les sauts entre les segments d’un chiffre doivent avoir la même longueur que les segments courts.
- Les sauts entre les chiffres doivent avoir la même longueur que les longs segments.
- Chaque segment et pause peut s'écarter jusqu'à 10% de la longueur moyenne de ce type de segment / pause.
- La totalité du fichier audio ne doit pas dépasser 30 secondes.
Les pauses n'ont pas besoin d'être complètement silencieuses, mais les segments Morse doivent être plus forts que les pauses.
Notez que vous devez écrire un fichier audio. Vous ne pouvez pas simplement jouer le son, par exemple en utilisant des bips système. Vous êtes autorisé à utiliser n'importe quel type de bibliothèque pour gérer le format de fichier et la génération audio, mais vous ne devez pas utiliser les fonctionnalités intégrées pour le codage Morse.
C'est le code de golf, donc la réponse la plus courte (en octets) gagne.
Veuillez envisager de créer un lien vers un téléchargement du fichier audio résultant (sur SoundCloud ou similaire), afin que les utilisateurs puissent consulter le résultat sans avoir à exécuter votre code. Si vous téléchargez sur SoundCloud, assurez-vous d’activer les téléchargements dans l’onglet Autorisations de la piste.
Si votre sortie utilise un format de fichier plutôt inhabituel, veuillez ajouter des informations sur la manière de la lire et / ou la convertir en un format plus courant, puis téléchargez-la.
Exemple de piste
Il s’agit d’un exemple de piste généré manuellement qui est conforme à la spécification et utilise du bruit pour les segments Morse (bruit de fond du microphone, pour être précis). Voici un lien vers SoundCloud si le lecteur intégré ne fonctionne pas pour vous.
Détails de la prime
J'attribuerai la prime à la soumission la plus courte dans un langage de programmation audio , c'est-à-dire un langage conçu pour synthétiser le son. Cette liste n’est pas complète, alors n'hésitez pas à utiliser un autre langage de programmation audio, si vous en connaissez un. Si vous ne savez pas si un langage que vous souhaitez utiliser peut être considéré comme un langage de programmation audio, veuillez me le faire savoir dans les commentaires ou dans le chat , et nous pourrons en discuter.
Notez que votre soumission doit toujours respecter toutes les règles - en particulier, elle doit écrire un fichier, ce qui pourrait ne pas être possible dans tous les langages de programmation audio. Par exemple, pour autant que je sache , Gibber ne peut que lire le son et ne pas l'enregistrer dans un fichier.
Réponses:
AWKBASH:66866774 octetsÀ la demande de Martin Büttner, j’ai ajouté un tempo car, après vérification de la norme de notation ABC , il semble qu’il n’y ait pas de valeur par défaut définie pour cela (merci nutki de nous l'avoir signalé).
J'écris aussi dans un fichier disque (a) au lieu de STDOUT puisque la question voulait explicitement "un fichier sur disque".
Je mets un tempo de 99 qui fait que le fichier audio dure 22 secondes; C'est plus lent que ma version précédente, mais au moins maintenant, il est supposé avoir la même longueur sur tous les joueurs de ABC, et cela dure moins de 30 secondes.
Cela ressemble beaucoup à la version précédente, comme vous pouvez le constater:
Voici le nouveau fichier midi .
Première version de BASH (le tempo est manquant)
Pourquoi n'ai-je pas pensé à cela en premier ...: o)
C'est 22 octets de moins qu'avec AWK, pour le même résultat
Comme la version précédente dans AWK, il écrit sur stdout un fichier de notation "ABC" valide (merci à Tobia d'avoir découvert que l'instruction "L" était facultative).
Cela ressemble à ceci:
Et cela ressemble exactement à la version précédente .
Version précédente en AWK (86 octets)
Voici une nouvelle version. un peu plus long, mais avec un timing plus précis. Je laisse la première version ci-dessous pour comparaison / référence:
Ceci est toujours un fichier "abc" valide, qui ressemble à ceci:
Voici le nouveau fichier midi (j'ai accéléré le tempo pour rester sous la limite des 30 secondes).
Première version en AWK (66 octets):
C'est beaucoup moins intéressant que ma réponse précédente , mais c'est beaucoup plus court, donc:
Cela génère un fichier "abc" valide, qui peut être lu (entre autres) dans EasyABC. Il ressemblera à ceci:
et ça sonnera comme ça (fichier midi) . +
la source
Code machine x86 (fichier .COM):
121120113109 octetsHexdump:
Peut être facilement exécuté sous DosBox; la sortie est un fichier .SND nommé
SND
. Voici une version FLAC de sa sortie (et ici le fichier .COM).Assemblée commentée:
L’
data.dat
inclusion ci-dessus est une représentation facile à utiliser de la chaîne morse (bit inférieur: son activé / désactivé, 7 bits supérieurs: longueur du son dans les échantillons >> 4) générée par un script Python:la source
a
ofa.snd
est placé juste avant l'en-tête SND, qui commence par.snd
suivi d'un octet nul. Je récupère donc la.snd
partie gratuitement et je recycle son terminateur zéro. De plus, le fait que l'en-tête commence un octet après le nom du fichier me permet d'utiliser uninc dx
pour passer à l'en-tête (1 octet) au lieu demov dx, header
(3 octets). OTOH, si on me permettait de l'appeler tout.snd
seul, je pourrais économiser deux octets, mais je ne suis pas sûr que le vrai DOS le permette (le traitement de l'extension sous DOS était assez particulier)..SND
: je suis arrivé.SND
sur DosBox,SND~1
sur FreeDOS, et j'attends autre chose sur du "vrai" DOS; donc, c’est définitivement le domaine du "comportement non défini". En fin de compte, j'ai réglé l'appel du fichierSND
(moins d'un octet à cause de la suppressiona
, en gardant le coût duinc dx
- qui devientdec dx
).Mathematica - 130
Jouer en ligne
la source
Export
, comme"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
devrait(b=None~s~#&)@.4
également être , vous pouvez enregistrer 3 caractères en utilisantr = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
Perl 5: 94
122 140Les fichiers SND ont des en-têtes plus simples, pas besoin d’imprimer en binaire. Cette version produit un fichier SND mono de 8khz nommé 'a':
Le fichier de résultat .
Ancienne solution. Produit un fichier WAV mono de 1khz 8 bits nommé 'a':
Le fichier de résultat .
Pour obtenir 122 caractères, je devais coller l'en-tête en binaire au lieu de le compresser, ce qui rend le code difficile à copier ici. La version échappée est:
Encodage en base64 de la solution actuelle de 122 octets:
la source
.au
extension, peut-être. Bien joué!AWK:
172170 octets... et sans utiliser aucune bibliothèque d'ondes! (*)
Ceci sort un fichier audio Sun au sur stdout qui peut être lu par vlc (entre autres). Au fileformat n’ayant aucune limitation de fréquence d’échantillonnage, VLC refuse de lire les fichiers dont le taux d’échantillonnage est inférieur à 4096 Hz. J’ai donc utilisé cette fréquence.
EDIT: Lien vers le fichier audio résultant sur DropBox
(*) Ne devrait-il pas y avoir un bonus pour cela? ; o)
la source
d=d "\177
... concaténation. Cela sauve un octet. Mais quand je joue le fichier audio résultant, il semble qu'il manque la dernière phrase du 5.Python, 155
Utilise le module wave intégré python.
Écrit dans un fichier appelé
n
.Merci à Sp3000 pour ses suggestions sur l’utilisation de la compréhension de liste pour la boucle (cela a permis de supprimer un peu d’indentation).
Écoute le:
https://soundcloud.com/bitpwner/morse-the-new-year-2015
Voici un lien vers SoundCloud si le lecteur intégré ne fonctionne pas pour vous.
Code commenté:
la source
w
est un effet secondaire, je pense que vous pouvez lister comp pour économiser deux octets:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
C #,
556552536535516506503491483 octetsUtilise la bibliothèque Wav.Net .
Sorties dans un fichier nommé
a
.Résultat hébergé sur Dropbox
Code non golfé:
la source
Python
32191188174171 (pas de bibliothèques)Les fichiers WAV sont incroyablement simples. Voulu essayer sans bibliothèques. Pour une raison quelconque, mes fichiers semblent planter Windows Media Player. Quick Time
travauxbugs à mi-chemin dans le fichier. La conversion à une plus grande fréquence d'échantillonnage en utilisant Audition résout ce problème.Mise à jour : implémentation de certaines optimisations à partir de la réponse Perl. Maintenant, sorties avec juste le nom
n
et en échantillonnage 1000Hz. Edité les informations ci-dessus en conséquence.Ancienne version
la source
C # ~ 485 octets
Utilisation de la bibliothèque Wav.Net .
Et voici la sortie.
Version lisible,
la source
C #
382333bytesN'utilise pas de bibliothèques non standard, écrit un wav de 44100 échantillons par seconde à 8 bits par échantillon, avec ce que j'espère est un en-tête valide (semble jouer / charger dans WMP / .NET / Audacity).
L'en-tête est codé en base64 et le morse est codé en tant que signal activé / désactivé qui est stocké dans une seule longueur (64 bits) car les 5 derniers bits sont identiques au premier.
Le résultat peut être trouvé ici
Code de golf:
Avec des commentaires:
la source
.wav
, vous pouvez donc y sauvegarder 4 octets.SuperCollider ,
625605 octetsSoumission en langage de programmation audio!
La sortie est écrite dans un fichier
b
au format AIFF. Windows Media Player ne parvient pas à l'ouvrir, mais cela fonctionne correctement dans VLC Media Player. Le fichier généréa
est un fichier OSC .J'ai créé quelques fonctions SuperCollider:
f
génère un bip court,g
une courte pause,h
un long bip eti
une longue pause. SuperCollider a besoin des positions de départ pour chaque onde sinusoïdale et non d'une longueur. J'ai donc dû créer des fonctions qui génèrent une onde avec la position de départ correcte et je dois les appeler à chaque fois que j'ai besoin d'une onde sinusoïdale. (Je ne pouvais pas stocker une vague d'une longueur spécifique dans une variable pour la réutiliser). La\w
définition est créée à la fin du bloc de code.Sur mon ordinateur Windows, le fichier audio n'a pas été enregistré dans le même répertoire que mon code, mais dans ce répertoire:
Résultat hébergé sur Dropbox
Code avec indentation:
la source
ChUCK -
1195217201147145144ChucK est un langage de programmation audio. bitpwner m'a aidé à passer de 201 octets à 147 octets.
Voici un lien direct vers SoundCloud si le lecteur intégré ne fonctionne pas pour vous.
la source
WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
j
pour éviter le tableau?1016835
en binaire est11111000010000000011
.j
est là pour simplement garder trace des pauses entre chaque chiffre de2015
(chaque chiffre a 5 sons).Csound, 140 + 40 = 180
Langage de programmation audio.
C'est le fichier d'orchestre:
et voici le fichier Score:
Les tailles sont calculées en supposant l'absence d'espaces supplémentaires, d'un terminateur de ligne unique (UNIX) et d'aucun terminateur après la dernière ligne.
Vous les appelez à l'aide de la commande csound:
qui produira un fichier de sortie dans le répertoire courant, nommé par défaut "test.aif"
https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq
J'aurais pu raser deux ou trois octets en choisissant une forme d'onde plus laide, mais j'aime bien le son de la traditionnelle onde sinusoïdale Morse.
PS: Je suis un novice total chez Csound, tous les conseils relatifs au golf sont appréciés, en particulier en ce qui concerne le fichier de score!
la source
brainfuck , 649 octets
Cela génère une séquence d'échantillons non signés de 8 bits qui peuvent être lus à 8 000 échantillons par seconde avec un outil tel que
aplay
Linux. Crédit au tableau des constantes BF .Essayez-le en ligne!
Un peu moins golfé
la source