Звук слів


11

Люди написали багато речей, що дозволяють візуалізувати одну річ як іншу. Тепер я пропоную вам можливість перекладати листи на музику! Ваша робота - написати програму, яка бере текстовий файл і видає звуковий файл із кожною буквою, перетвореною на певну ноту C3-C8.

Відмова - Я насправді не очікую, що музика звучить добре, але сподіваюся здивуватися.

Технічні умови

  • Ви приймаєте ім'я файлу як рядок, а BPM (удари в хвилину) як int
  • Ви робите великі регістри Aяк нотуC3
  • І перейдіть на півкроку для кожного персонажа в такому порядку: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • Так, не кожен символ буде використовуватися, оскільки він охоплює занадто багато октав.
  • Ви перекладаєте кожен символ у файлі таким чином
  • Помістіть нотатки в даний BPM як квартальні нотатки
  • Або збережіть як звуковий файл (я думаю, Міді буде найпростішим, але все в порядку) або відтворити його
  • Будь-який здоровий формат введення нормально
  • Немає стандартних лазівки
  • Це код-гольф, тому найкоротший код у байтах виграє!

Бонуси

  • Дозволити переміщення виводу - 50 байт
  • Дозвольте накладати декілька треків один на одного, взявши кілька файлів - 75 байт
  • Об’єднайте послідовні букви в одну довшу нотатку - 50 байт

Редагувати: Вау, у нас є негативні бали. Я оголошую переможця в суботу.


Коли ви будете визначати переможця?
LegionMammal978

Чи можемо ми припустити, що вхід не буде містити жодних символів, які не є у списку Або що нам робити, коли ми стикалися з символами, які не були в списку?
апспіллери

@apsillers В оснащенні ! відповівши, він сказав, що дозволить визначити поведінку.
LegionMammal978

Я завантажив зразок; ви були цілком правильні, це насправді не звучить нічого доброго
Sanchises

Відповіді:


6

МАТЛАБ, 159-50-50-75 = -16

Зразок введення

Вибірка зразка

Створює чисті синусоїдні звукові хвилі, дуже фанкі (пилозуб також можливий, з ще кращою оцінкою, але це звучить трохи ... занадто фанкі). Працює як функція, тому очікує, що це масив символів ( ['abc';'def']) з одним рядком на 'трек'. Я думаю, що це стосується "будь-якого розумного формату введення" , але якщо загальний консенсус полягає в тому, що мені потрібно прочитати файл, я вважаю, що я можу його змінити. Введення i- це текстові треки (однакової довжини), bудари в хвилину і tпереміщення (подача 0 для не переміщених). Він поєднує два синуси в один, компенсуючи синус введення, тому я отримав усі три бонуси, давши мені негативну оцінку.

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

Версія з використанням вхідного файлу: 211-175 = 36

Аргумент введення iтепер представляє ім'я файлу, інші параметри не змінюються. Можливо, не працюватимуть над новими випусками, тому що я отримую попередження, яке textreadскоро може бути застарілим. EDIT: textread очевидно автоматично розбивається на пробіли, тому я це виправив. Крім того, я думаю, що, можливо, я випадково зв’язався з деякими прибульцями дивними звуками, які лунали під час тестування.

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

Якій версії ви надаєте перевагу? :)


Ну, специфікація прямо говорить про те, щоб взяти вхід з файлу ...
LegionMammal978

@ LegionMammal978 Якщо ви наполягаєте: .matфайли мають нормальний формат введення. Створіть .mat файл із змінною 'i', яка містить ваш текст. Потім додайте load(i);на початку рядка 2 верхньої версії. Оцінка: -16 + 8 = -8. Я зроблю це, коли ваш коментар отримає більше відгуків, ніж мій, або коли ОП має думку :)
Санчіз

4

Оснастка ! - 401 - 75 = 326

Спробуйте його онлайн тут.

Я використовую цей метод підрахунку байтів для програми.

введіть тут опис зображення

Я додав відтворення декількох звуків одночасно.

Основна структура така ж, як і оригінальна (див. Нижче), але з додаванням launch{}. launch{}запускає новий потік з кодом всередині, що забезпечує сумісність.

Код як текст:

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

Оригінальний код, 308.

введіть тут опис зображення

Пощастило оснащення! вбудована гра MIDI;)

На жаль, у нього немає indexOfфункції, тому мені доводиться робити зовнішній дзвінок JavaScript, що досить дорого.

repeat () (#)Блок поставляється з бібліотеки ітерацій.

Код може бути записаний у такому вигляді як текст, саме так я отримую 308 байт:

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 колекція / вітрина, яку ви можете додати до таких, як це робить Scratch? Підключення безпосередньо до запущеної версії було б зручним для ІМО.
Геобіц

Так. Я додав посилання на свій проект. Гарна ідея. :)
Scimonster

Є чи ігнорувати це -1від indexOf? Зараз це схоже на те, що якщо його немає в рядку, то це міді номер 47.
Малтісен

@Maltysen Питання ніколи не говорить про те, що робити з введенням поза відповідним діапазоном.
Scimonster

Правда. Я мав на увазі, щоб це було проігноровано, але оскільки я гадаю, що я винен у тому, що він недостатньо конкретний, я дозволю це.
Мальтісен

4

Математика, 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}]]/@#]&

Знімає список вхідних файлів, BPM та кількість напівкрокових кроків, які слід перенести на вхід та відтворює звук (з піаніно, будь-який інший інструмент займе більше байтів.) Це не так погано звучить!


1

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

По-перше, ось фрагмент для запуску, який використовує <input>поля замість зчитування файлів:

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

А тепер фактичний запис:

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

Три аргументи - це масив рядків файлопроводу, який потрібно одночасно відтворювати, нотатки за хвилину та кількість напівкрокових кроків для транспонування всіх входів.

З пробілами та коментарями:

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.