Создать GUI Piano [закрыто]

15

Вызов

Создайте клавиатуру с графическим интерфейсом, используя как можно меньше символов.

пример

Поскольку это было задание на одном из моих курсов, я не могу показать исходный код. Тем не менее, вот снимок экрана моей клавиатуры.

пианино

В этом примере мои ключи были типового типа, JButtonи я использовал синтезатор Midi для создания звука (со значениями огибающей ADSR по умолчанию).

правила

  • Вам разрешено использовать стандартные внешние библиотеки.
  • Будьте изобретательны со своим звуком. Вы можете использовать 8-битный, ситар и т. Д.
  • Для простоты у вас может быть пять ключей; черный и белый, от C до E (первые пять клавиш на моей клавиатуре).
  • Самое главное ... продемонстрировать свою работу!

ЗАМЕЧАНИЕ . В зависимости от того, с каким языком вы работаете, это может быть довольно большой задачей.

Это мой первый вопрос по SE Code Golf. Если что-то неясно, пожалуйста, попросите дополнительную информацию.


РЕДАКТИРОВАТЬ : Срок подачи этого вызова будет 22.09.12. Если вы отправите ответ после этой даты, я просматриваю его независимо (и, возможно, +1).

обкрадывать
источник
2
Ограничения по используемому языку здесь не очень нравятся. Подумайте об отмене ограничения или назовите важную причину.
FUZxxl
1
@FUZxxl Как указано в разделе «Пример», это был термин проект для нашего класса Java. Это все еще используется в качестве термина проекта для этого самого класса. Но я полагаю, что я просто параноик, поэтому я откажусь от ограничений. Я думаю, вы имели в виду, какие языки не использовать ... но что бы я ни делал, я их удалил.
Роб
2
Какие минимальные требования нужно считать «клавиатурой с графическим интерфейсом»? Из того, что уже присутствует, я делаю вывод, что он должен отображать графический интерфейс и воспроизводить звук, но какие существуют ограничения: а) механизм ввода; б) звуковая оболочка; в) используемая шкала; г) точность настройки; е) пропорции клавиш?
Питер Тейлор
2
@MikeDtrick, это отвечает на 0/5 моих вопросов. Я не спрашиваю, как работала ваша реализация: я спрашиваю, как я могу узнать, является ли моя (гипотетическая) реализация действительным конкурентом, потому что нет смысла сокращать запись на 20%, если это делает ее недействительной. неверный.
Питер Тейлор
1
@MikeDtrick: Например, вам может потребоваться, чтобы кнопки выглядели точно так же, как в вашем примере, пиксель за пикселем. С другой стороны, вы можете разрешить любое расположение пяти кнопок GUI любого типа.
хан

Ответы:

11

Mathematica 319 259 255


Редактировать: теперь клавиши нажимаются (как кнопки) при нажатии.


Это будет играть ноты рояля {"C", "C #", "D", "D #", "E"}, где "C" - середина C. z[n_]играет ноту.

z@n_ := EmitSound@Sound[SoundNote[n, .3, 1]]; w = {10, 300}; b = {35, 180};
Graphics[Inset[Button["", z[#[[1]]], Background -> If[#[[2]] == w, None, Black], 
ImageSize -> #〚2〛], #〚3〛] & /@ {{"C", w, {-.4, 0}}, {"D", w, {0, 0}}, {"E", w, {.4, 0}}, 
{"C#", b, {-.2, 0.31}}, {"D#", b, {.2, 0.31}}}, PlotRange -> 1]

клавиатура


Клавиатуру можно расширить до 18 клавиш, используя не более двух символов:

z@n_ := EmitSound@Sound@SoundNote[n, .3, 1];
w = {"C", "D", "E", "F", "G", "A", "B", "C5", "D5", "E5", "F5"};
b = {"C#", "D#", "", "F#", "G#", "A#", "", "C#5", "D#5"}; i = ImageSize; t = Thread; 
l = List; s = Inset; m = Table; u = Button;
Graphics[Join[t[s[u @@@ t[l["", y /@ w, i -> {5, 350}]] /. y -> z, m[{90 k, 0}, {k, -5, 5}]]], 
Delete[t[s[u @@@ t[l["", y /@ b, Background -> Black, i -> {28, 212}]] /. 
  y -> z, m[{90 k + 45, 220}, {k, -5, 3}]]], {{3}, {7}}]], 
AspectRatio -> .45, PlotRange -> {{-500, 500}, {-610, 610}}, i -> {800, 430}]   

большая клавиатура

DavidC
источник
1
+1 Я не сомневаюсь, что это сработает ... Я просто хотел бы сыграть на этом.
Роб
1
Я оставил .cdf версию файла в своем DropBox на dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5. Вы можете поделиться этим с другими. Там не должно быть никаких проблем с лицензированием, потому что он используется в некоммерческих, образовательных целях. Вам нужно будет загрузить бесплатный CD-плеер Wolfram, если у вас его еще нет.
DavidC
Дэвид, мне нужно w = {67, 300}получить твой результат; Есть идеи, почему разница? Кроме того, могу ли я отредактировать этот код, чтобы сократить его, если смогу?
Mr.Wizard
Mr.Wizard. w = {67,300}отлично работает на v. 9, так что если вы хотите изменить его или, если уж на то пошло, сократить любой код, продолжайте. Регулировка размера кнопки была нажата или пропущена. Странные вещи произошли по причинам, которые я не могу объяснить. (Например, добавление дополнительных кнопок влияет на пропорции оригинальных кнопок.)
DavidC
10

Веб-страница (840/796 знаков)

>>> Начните играть (Internet Explorer не поддерживается по нескольким причинам; Google Chrome и Opera работают лучше всего.)

Я, наверное, мог бы сделать это немного короче, но это хорошее начало. Более низкий балл - после замены всех вхождений  самим символом и удаления ключевого слова new, последнее изменение нарушает совместимость Google Chrome.

<style>table{border-collapse:collapse;border-width:1 0;border-style:solid;font-size:64;line-height:2}td{border-style:solid;border-width:0 1}</style><table><td colspan=3 title=0>&nbsp;<td bgcolor=black colspan=2 title=1>&nbsp;<td colspan=2 title=2>&nbsp;<td bgcolor=black colspan=2 title=3>&nbsp;<td colspan=3 title=4>&nbsp;<tr><td colspan=4 title=0>&nbsp;<td colspan=4 title=2>&nbsp;<td colspan=4 title=4>&nbsp;</table><script>for(A=[y=5];y--;){for(s=x=64e3;x--;)s+="~ "[x*(268+17*y)>>13&1];A[y]=new Audio("data:audio/wav;base64,UklGRiXuAgBXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQHuAgCA"+btoa(s))}setInterval("for(y=5;y--;)with(A[y])volume=volume&&Math.exp(-currentTime)",99);onmousedown=function(e){if(z=e.target.title)with(A[z])play(currentTime=0,volume=1)};onmouseup=function(e){if(z=e.target.title)with(A[z])pause(volume=0)}</script>

Сохраните этот код в виде текстового файла с именем, оканчивающимся на .htm или .html, и откройте его в Chrome или Opera (Safari также может работать) или просто откройте страницу JSBin решения, чтобы начать воспроизведение. Я повторно использовал заголовок файла WAV из своего решения проблемы с гольф-кодом Twinkle Twinkle Little Star .

Важной особенностью является то, что звук уменьшается с течением времени. Чтобы наблюдать это поведение, попробуйте удерживать клавишу в течение нескольких секунд и слушать, что происходит.

Вот более читаемая версия кода:

<style>
    table {
        border-collapse: collapse;
        border-width: 1 0;
        border-style: solid;
        font-size: 64;
        line-height: 2;
    }

    td {
        border-style: solid;
        border-width: 0 1;
    }
</style>

<table>
        <td colspan=3 title=0>&nbsp;
        <td bgcolor=black colspan=2 title=1>&nbsp;
        <td colspan=2 title=2>&nbsp;
        <td bgcolor=black colspan=2 title=3>&nbsp;
        <td colspan=3 title=4>&nbsp;
    <tr>
        <td colspan=4 title=0>&nbsp;
        <td colspan=4 title=2>&nbsp;
        <td colspan=4 title=4>&nbsp;
</table>

<script>
    for (A = [y = 5]; y--;) {

        for (s = x = 64e3; x--;)
            s += "~ "[x * (268 + 17 * y) >> 13 & 1];

        A[y] = new Audio("data:audio/wav;base64,UklGRiXuAgBXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQHuAgCA" + btoa(s));
    }

    setInterval(function() {
        for (y = 5; y--;)
            with (A[y])
                volume = volume && Math.exp(-currentTime);
    }, 99);

    onmousedown = function(e) {
        if (z = e.target.title)
            with (A[z])
                play(currentTime = 0, volume = 1);
    };

    onmouseup = function(e) { 
        if (z = e.target.title)
            with (A[z])
                pause(volume = 0);
    };
</script>
PleaseStand
источник
1
+1 Хорошо работает в Firefox 15, хотя я бы выбрал более качественный инструмент.
DavidC
6

Groovy: 577 (703 с пробелами)

Первые 5 заметок. Другие могут быть добавлены легко, это несколько динамично.

Чертовы качели. Возможно, со свинговой библиотекой было бы лучше.

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

Играет через JFugue.

На github: https://github.com/wpiasecki/glissando/blob/master/src/br/glissando/Piano.groovy

На заводной 2.0.2

import java.awt.event.*
class Note { def n; boolean s; def p() { new org.jfugue.Player().with {play n;close()}} }
notes=['C','C#','D','D#','E'].inject([]){ l,n -> l<< Note[n:n,s:n=~/#/]}
h=300
l=0
w=60
x=0
new groovy.swing.SwingBuilder().edt {
  frame size:[notes.size()*30+30,h], 
    show:true, 
    defaultCloseOperation:javax.swing.JFrame.EXIT_ON_CLOSE, 
    { l = layeredPane() }
  notes.each { n ->
    C=java.awt.Color
    s=n.s
    p=panel bounds:(s ? [x-15,0,w-30,h-100] : [x,0,w,h]),
      background: s ? C.BLACK : C.WHITE, 
      border: lineBorder(1, color: C.BLACK)
    p.addMouseListener({ if(it.id==MouseEvent.MOUSE_CLICKED)n.p() }as MouseListener)
    if(!s)x+=w
    l.add p,s?0:1
  }
}
Будет Lp
источник
1

R - 491 символов

Я немного опоздал, но я только что видел этот пост вчера.

Работает на Mac, использует playRWave и пакеты tuneRи splancs.

a=array
x=c(7,2)
y=c(5,2)
z=c(1,1,3,3)
par(mar=rep(0,4))
plot(NA,xli=c(0,9),yli=c(0,3))
N=list(a(c(0,3,3,2,2,0,0,0,0,z,0),x),a(c(3,6,6,5,5,4,4,3,3,0,0,z,1,1,0),c(9,2)),a(c(6,6,7,7,9,9,6,0,z,0,0),x),a(c(2,4,4,2,2,z,1),y),a(c(5,7,7,5,5,z,1),y))
c=c(NA,NA,NA,1,1)
for(i in 1:5){polygon(N[[i]],c=c[i])}
h=c(261.63,293.66,329.63,277.18,311.13)
library(tuneR)
setWavPlayer("~/Library/Audio/playRwave")
repeat{P=data.frame(locator(1));play(sine(h[sapply(N,function(x)splancs::inout(P,x))],bit=16))}

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

Ungolfed:

par(mar=rep(0,4))
plot(NA,xlim=c(0,9),ylim=c(0,3)) #Create empty plot: due to fuzzy matching of arguments, xlim can be reduced to xli
N=list(array(c(0,3,3,2,2,0,0,0,0,1,1,3,3,0),dim=c(7,2)), #C polygon
       array(c(3,6,6,5,5,4,4,3,3,0,0,1,1,3,3,1,1,0),dim=c(9,2)), #D polygon
       array(c(6,6,7,7,9,9,6,0,1,1,3,3,0,0),dim=c(7,2)), #E polygon
       array(c(2,4,4,2,2,1,1,3,3,1),dim=(5,2)), #Db polygon
       array(c(5,7,7,5,5,1,1,3,3,1),dim=(5,2)))  #Eb polygon
c=c(NA,NA,NA,1,1) #Colors: by default 1 is "black"
for(i in 1:5){polygon(N[[i]],color=c[i])}
h=c(261.63,293.66,329.63,277.18,311.13) #Notes frequency in hertz: C4, D4, E4, Db4 and Eb4
library(tuneR)
setWavPlayer("~/Library/Audio/playRwave") #This can be change to other wav player I think
repeat{
    P=data.frame(locator(1)) #Grab coordinates of selected point
    H=h[sapply(N,function(x)splancs::inout(P,x))] #In which polygon does the selected point belong to, then map it to its ferquency
    s=sine(H,bit=16) #By default create a 1sec note at the given frequency with 44100 sampling rate
    play(s)
    }
plannapus
источник