Dźwięk słów

11

Ludzie napisali wiele rzeczy, które pozwalają wizualizować jedną rzecz jako drugą. Teraz proponuję tłumaczenie liter na muzykę! Twoim zadaniem jest napisanie programu, który pobiera plik tekstowy i wysyła plik dźwiękowy z każdą literą przekonwertowaną na określoną notatkę C3-C8.

Oświadczenie - właściwie nie oczekuję, że muzyka zabrzmi dobrze, ale mam nadzieję, że będę zaskoczony.

Dane techniczne

  • Bierzesz nazwę pliku jako ciąg, a BPM (liczbę uderzeń na minutę) jako liczbę całkowitą
  • Robisz wielkie litery, Aaby być notatkąC3
  • I przejdź o pół kroku dalej za każdą postacią w następującej kolejności: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • Tak, nie każda postać zostanie użyta, ponieważ obejmuje ona zbyt wiele oktaw.
  • W ten sposób tłumaczysz wszystkie znaki w pliku
  • Połącz notatki na danym BPM jako ćwierćnuty
  • Albo zapisz jako plik dźwiękowy (domyślam się, że midi będzie najłatwiejszy, ale wszystko jest w porządku) lub zagraj
  • Każdy rozsądny format wejściowy jest w porządku
  • Brak standardowych luk
  • To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach !

Bonusy

  • Pozwól transponować wyjście - 50 bajtów
  • Zezwalaj na nakładanie się na siebie wielu ścieżek poprzez pobieranie wielu plików - 75 bajtów
  • Połącz kolejne litery w jedną dłuższą notatkę - 50 bajtów

Edycja: Wow, mamy negatywne wyniki. Zwycięzcę ogłosimy w sobotę.

Maltysen
źródło
Kiedy wybierzesz zwycięzcę?
LegionMammal978
Czy możemy założyć, że dane wejściowe nie będą zawierać żadnych niepublicznych znaków? Lub co powinniśmy zrobić, gdy napotkamy postacie niepubliczne?
apsillers
@apsillers In the Snap ! odpowiedź, powiedział, że pozwoli na nieokreślone zachowanie.
LegionMammal978
Przesłałem próbkę; miałeś
całkowitą

Odpowiedzi:

6

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

Przykładowe dane wejściowe

Próbka wyjściowa

Generuje czyste sinusoidalne fale dźwiękowe, bardzo funky (piła jest również możliwa, z jeszcze lepszą partyturą, ale brzmi to trochę ... zbyt funky). Działa jako funkcja, więc oczekuje od niej tablicy znaków ( ['abc';'def']) z jednym rzędem na „ścieżkę”. Myślę, że jest to ujęte w „dowolnym rozsądnym formacie wejściowym” , ale jeśli ogólny konsensus jest taki, że muszę czytać plik, myślę, że mogę go zmienić. Wprowadzane isą ścieżki tekstowe (o równej długości), liczba buderzeń na minutę i ttranspozycja (należy podać 0, aby nie transponować). Łączy dwa sinusy w jeden, kompensując wkład sinusoidalny, więc otrzymałem wszystkie trzy bonusy, co dało mi wynik ujemny.

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

Wersja z plikiem wejściowym: 211-175 = 36

Argument wejściowy ireprezentuje teraz nazwę pliku, pozostałe parametry pozostają niezmienione. Może nie działać w nowszych wersjach, ponieważ otrzymuję ostrzeżenie, które textreadwkrótce może być przestarzałe. EDYCJA: czytanie tekstu najwyraźniej automatycznie dzieli się na białe spacje, więc to naprawiłem. Myślę też, że przypadkowo mogłem skontaktować się z kosmitami z dziwnymi dźwiękami wydanymi podczas testowania.

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

Którą wersję preferujesz? :)

Sanchises
źródło
Cóż, specyfikacja wyraźnie mówi, aby pobrać dane wejściowe z pliku ...
LegionMammal978
@ LegionMammal978 Jeśli nalegasz: .matpliki mają rozsądny format wejściowy. Utwórz plik .mat ze zmienną „i” z tekstem. Następnie dodaj load(i);na początku wiersza 2 najwyższej wersji. Wynik: -16 + 8 = -8. Zrobię to, gdy twój komentarz zyska więcej głosów niż mój, lub gdy OP ma opinię :)
Sanchises
4

Snap ! - 401 - 75 = 326

Wypróbuj online tutaj.

Używam tej metody liczenia bajtów dla programu.

wprowadź opis zdjęcia tutaj

Dodałem odtwarzanie wielu dźwięków jednocześnie.

Podstawowa struktura jest taka sama jak oryginalna (patrz poniżej), ale z dodatkiem launch{}. launch{}rozpoczyna nowy wątek z kodem w środku, umożliwiając współbieżność.

Kod jako tekst to:

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

Kod oryginalny, 308.

wprowadź opis zdjęcia tutaj

Lucky Snap! ma wbudowane odtwarzanie MIDI;)

Niestety nie ma żadnej indexOffunkcji, dlatego muszę wykonać zewnętrzne wywołanie JavaScript, które jest dość drogie.

repeat () (#)Blok pochodzi z biblioteki iteracji.

Kod można zapisać jako tekst taki jak ten, w ten sposób otrzymuję 308 bajtów:

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
Scimonster
źródło
Czy SNAP ma kolekcję / prezentację, do której możesz je dodać, tak jak Scratch? Przydatne byłoby bezpośrednie połączenie z wersją do uruchomienia.
Geobits,
Tak. Dodałem link do mojego projektu. Dobry pomysł. :)
Scimonster,
Czy to ignorować -1od indexOf? Teraz wygląda na to, że jeśli nie ma go w łańcuchu, to ma numer 47.
Midi
@Maltysen Pytanie nigdy nie mówi, co zrobić z danymi wejściowymi poza odpowiednim zakresem.
Scimonster,
Prawdziwe. Chciałem go zignorować, ale ponieważ sądzę, że to moja wina, że ​​nie był wystarczająco szczegółowy, pozwolę na to.
Maltysen,
4

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

Pobiera listę plików wejściowych, BPM i liczbę kroków do transpozycji jako dane wejściowe i odtwarza dźwięk (z fortepianu, każdy inny instrument zająłby więcej bajtów.) Nie brzmi tak źle!

LegionMammal978
źródło
1

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

Po pierwsze, oto fragment, który można uruchomić, który używa <input>pól zamiast odczytu plików:

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

A teraz faktyczny wpis:

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

Te trzy argumenty to tablica ciągów ścieżek plików do jednoczesnego odtwarzania, nuty na minutę i liczba pół kroków do transpozycji wszystkich danych wejściowych.

Z białymi znakami i komentarzami:

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)
apsillery
źródło