Il suono delle parole


11

Le persone hanno scritto molte cose che consentono di visualizzare una cosa come un'altra. Ora propongo di poter tradurre le lettere in musica! Il tuo compito è quello di scrivere un programma che prende un file di testo e genera un file audio con ogni lettera convertita in una nota specifica da C3-C8.

Disclaimer - In realtà non mi aspetto che la musica suoni bene, ma spero di essere sorpreso.

specificazioni

  • Prendi il nome di un file come stringa e il BPM (battiti al minuto) come int
  • Rendi maiuscola Ala notaC3
  • E sali di mezzo passo per ogni personaggio dopo in questo ordine: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • Sì, non tutti i personaggi verranno utilizzati poiché si estende su troppe ottave.
  • In questo modo traduci tutti i caratteri nel file
  • Metti insieme le note al BPM dato come note da un quarto
  • O salva come file audio (suppongo che il MIDI sarà il più semplice, ma è tutto a posto) o riproducilo
  • Qualsiasi formato di input sano va bene
  • Nessuna scappatoia standard
  • Questo è code-golf, quindi vince il codice più breve in byte !

bonus

  • Consenti trasposizione dell'output - 50 byte
  • Consenti a più tracce di essere sovrapposte l'una sull'altra prendendo più file - 75 byte
  • Unisci lettere consecutive in una nota più lunga - 50 byte

Modifica: Wow, abbiamo punteggi negativi. Annuncerò il vincitore sabato.


Quando deciderai il vincitore?
LegionMammal978,

Possiamo supporre che l'input non conterrà caratteri non elencati? Oppure, cosa dovremmo fare quando abbiamo incontrato personaggi non elencati?
apsillers

@apsillers In the Snap ! risposta, ha detto che avrebbe permesso comportamenti indefiniti.
LegionMammal978,

Ho caricato un campione; avevi ragione, non suona davvero bene ...
Sanchises

Risposte:


6

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

Input di esempio

Uscita campione

Genera onde sonore sinusoidali pure, molto funky (è anche possibile dente di sega, con un punteggio ancora migliore, ma suona un po '... troppo funky). Funziona come una funzione, quindi si aspetta un array di caratteri ( ['abc';'def']) con una riga per 'traccia'. Penso che sia coperto da "qualsiasi formato di input sano" , ma se il consenso generale è che devo leggere un file, suppongo di poterlo modificare. L'input iè costituito da tracce di testo (di uguale lunghezza), bbattiti al minuto e ttrasposizione (fornire 0 per non trasposto). Unisce due seni in uno compensando l'ingresso dei seni, quindi ho ottenuto tutti e tre i bonus, dandomi un punteggio negativo.

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

Versione utilizzando il file di input: 211-175 = 36

L'argomento di input iora rappresenta il nome del file, altri parametri invariati. Potrebbe non funzionare su versioni più recenti perché sto ricevendo un avviso che textreadpotrebbe presto essere deprecato. EDIT: apparentemente textread si divide automaticamente in spazi bianchi, quindi l'ho risolto. Inoltre, penso che potrei aver accidentalmente contattato alcuni alieni con i suoni strani emessi durante il test.

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

Quale versione preferisci? :)


Bene, la specifica dice esplicitamente di prendere l'input da un file ...
LegionMammal978

@ LegionMammal978 Se insisti: i .matfile hanno un formato di input sano. Crea un file .mat con una variabile 'i' con il tuo testo. Quindi, aggiungi load(i);all'inizio della riga 2 della versione principale. Punteggio: -16 + 8 = -8. Lo farò quando il tuo commento riceverà più voti dei miei, o quando l'OP avrà un'opinione :)
Sanchises

4

Snap ! - 401 - 75 = 326

Provalo online qui.

Sto usando questo metodo di conteggio dei byte per il programma.

inserisci qui la descrizione dell'immagine

Ho aggiunto la riproduzione di più suoni contemporaneamente.

La struttura di base è la stessa dell'originale (vedi sotto), ma con l'aggiunta di launch{}. launch{}avvia un nuovo thread con il codice all'interno, consentendo la concorrenza.

Il codice come testo è:

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

Codice originale, 308.

inserisci qui la descrizione dell'immagine

Lucky Snap! ha la riproduzione MIDI integrata.;)

Sfortunatamente, non ha una indexOffunzione, quindi devo effettuare una chiamata JavaScript esterna, che è piuttosto costosa.

Il repeat () (#)blocco proviene dalla libreria di iterazioni.

Il codice può essere scritto come testo come questo, ed è così che ottengo 308 byte:

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 ha una collezione / vetrina che puoi aggiungere a quelle di Scratch? Il collegamento diretto a una versione eseguibile sarebbe utile IMO.
Geobits il

Sì. Ho aggiunto un link al mio progetto. Buona idea. :)
Scimonster,

Ignora -1da indexOf? In questo momento sembra che non sia nella stringa, fa midi numero 47.
Maltysen

@Maltysen La domanda non dice mai cosa fare con un input al di fuori dell'intervallo corretto.
Scimonster,

Vero. Volevo che fosse ignorato, ma poiché immagino sia colpa mia per non essere abbastanza specifico, lo permetterò.
Maltysen,

4

Mathematica, 219-50-75-50-44 = 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}]]/@#]&

Prende l'elenco di file di input, BPM e numero di mezze fasi da trasporre come input e riproduce il suono (da un piano, qualsiasi altro strumento richiederebbe più byte). Non suona così male!


1

JavaScript (ES6) 377-50-50-50-75 = 202

Innanzitutto, ecco uno snippet eseguibile che utilizza i <input>campi anziché la lettura dei file:

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

E ora, la voce effettiva:

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

I tre argomenti sono una matrice di stringhe di percorso file da riprodurre contemporaneamente, note al minuto e numero di semipassi per trasporre tutti gli input.

Con spazi bianchi e commenti:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.