Kelimelerin Sesi


11

İnsanlar bir şeyin bir diğeri olarak görselleştirilmesine izin veren birçok şey yazmışlardır. Şimdi harfleri müziğe çevirmeyi öneriyorum! Bu, bir metin dosyası alan ve her harfin belirli bir nota dönüştürülmüş bir ses dosyası çıkaran bir program yazmak sizin işiniz C3-C8.

Feragatname - Müziğin gerçekten iyi görünmesini beklemiyorum ama şaşırmayı umuyorum.

Özellikler

  • Dosyanın adını dize, BPM (dakikadaki atım) olarak int olarak alırsınız
  • Büyük harf yapmak Anota olmakC3
  • Ve bu sırayla her karakter için yarım adım yukarı çıkın: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • Evet, her karakter kullanılmayacaktır, çünkü bu çok fazla oktav içermektedir.
  • Dosyadaki her karakteri bu şekilde çevirirsiniz
  • Çeyrek not olarak notları verilen BPM'de bir araya getirin
  • Ya ses dosyası olarak kaydet (sanırım midi en kolayı olacak, ama her şey yolunda) ya da çal
  • Herhangi bir aklı başında giriş biçimi iyi
  • Standart boşluk yok
  • Bu kod golf, bayt en kısa kod kazanır!

Bonuslar

  • Çıktının aktarılmasına izin ver - 50 bayt
  • 75 bayt - birden fazla dosya alarak birden çok parçanın üst üste gelmesine izin ver
  • Ardışık harfleri daha uzun bir nota katın - 50 bayt

Edit: Vay be, negatif puanları var. Kazananı Cumartesi günü ilan edeceğim.


Kazanana ne zaman karar vereceksin?
LegionMammal978

Girdinin listelenmemiş karakterler içermeyeceğini varsayabilir miyiz? Veya liste dışı karakterlerle karşılaştığımızda ne yapmalıyız?
apsillers

@apsillers Snap ! cevapsız bir davranışa izin vereceğini söyledi.
LegionMammal978

Bir örnek yükledim; oldukça haklıydın, gerçekten iyi gelmiyor ...
Sanchises

Yanıtlar:


6

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

Örnek giriş

Örnek çıktı

Çok korkak saf sinüs ses dalgaları üretir (testere dişi de daha iyi bir skorla mümkündür, ama bu biraz ... çok korkak geliyor). Bir işlev olarak çalışır, bu nedenle ['abc';'def']'parça' başına bir satır olan bir karakter dizisi ( ) bekler . Sanırım bu 'herhangi bir aklı başında giriş biçimi' altındadır , ancak genel fikir birliği bir dosyayı okumam gerektiğiyse, sanırım değiştirebilirim. Girdi imetin parçalarıdır (eşit uzunlukta), bdakikadaki atım sayısı ve tdevri (aktarılmamış için 0 kaynağı). Sinüs girdisini dengeleyerek iki sinüsü bir araya getirir, bu yüzden üç bonusumun hepsini aldım ve bana olumsuz bir puan verdim.

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

Giriş dosyasını kullanan sürüm: 211-175 = 36

Girdi bağımsız değişkeni iartık dosya adını, diğer parametreleri değiştirmeden gösterir. Daha yeni sürümlerde çalışmayabilir, çünkü textreadyakında kullanımdan kaldırılabilecek bir uyarı alıyorum . EDIT: textread görünüşte beyaz boşluklarda otomatik olarak böler, bu yüzden bunu düzeltti. Ayrıca, test sırasında yapılan garip seslerle bazı uzaylılarla yanlışlıkla temasa geçmiş olabileceğimi düşünüyorum.

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

Hangi sürümü tercih edersiniz? :)


Peki, spec açıkça bir dosyadan girdi almak diyor ...
LegionMammal978

@ LegionMammal978 Eğer ısrar ediyorsanız: .matdosyalar aklı başında bir giriş biçimindedir. Metninizi içeren 'i' değişkenli bir .mat dosyası oluşturun. Ardından, load(i);en üst sürümün 2. satırının başına ekleyin . Puan: -16 + 8 = -8. Yorumunuz benimkinden daha fazla oy aldığında veya OP'nin bir görüşü olduğunda bunu yapacağım :)
Sanchises

4

Çabuk ! - 401-75 = 326

Burada çevrimiçi deneyin.

Program için bayt sayma bu yöntemi kullanıyorum .

resim açıklamasını buraya girin

Aynı anda birden fazla ses çalmayı ekledim.

Temel yapı orijinal ile aynıdır (aşağıya bakın), ancak ilavesiyle launch{}. launch{}içerideki kodla eşzamanlılığa izin veren yeni bir konu başlatır.

Metin olarak kod:

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

Orijinal kod, 308.

resim açıklamasını buraya girin

Lucky Snap! dahili MIDI oynuyor.;)

Ne yazık ki, bir indexOfişlevi yok, bu yüzden oldukça pahalı bir harici JavaScript arama yapmak zorunda.

repeat () (#)Blok yineleme kütüphanesinden gelir.

Kod böyle 308 bayt almak nasıl böyle metin olarak yazılabilir:

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'ta bunları Scratch'ın yaptığı gibi ekleyebileceğiniz bir koleksiyon / vitrin var mı? Doğrudan çalıştırılabilir bir versiyona bağlanmak kullanışlı IMO olacaktır.
Geobits

Evet. Projeme bir link ekledim. İyi bir fikir. :)
Scimonster

O görmezden mu -1dan indexOf? Şu anda dizede değilse, 47 numaralı midi yapar gibi görünüyor
Maltysen

@Maltysen Soru, uygun aralığın dışında girdi ile ne yapılacağını asla söylemez.
Scimonster

Doğru. Göz ardı edilmek istedim ama yeterince spesifik olmadığım için benim hatam olduğunu tahmin ettiğim için buna izin vereceğim.
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}]]/@#]&

Giriş dosyaları, BPM ve girdi olarak aktarılacak yarım adımların listesini alır ve sesi çalar (bir piyanodan başka herhangi bir enstrüman daha fazla bayt alır.) O kadar da kötü değil!


1

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

İlk olarak, <input>dosya okumaları yerine alanları kullanan çalıştırılabilir bir snippet :

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

Ve şimdi, gerçek giriş:

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

Üç argüman, eşzamanlı olarak çalınacak bir dosya yolu dizeleri dizisi, dakika başına notlar ve tüm girdileri aktarmak için yarım adım sayısıdır.

Boşluk ve yorumlarla:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.