Створити графічний графічний інтерфейс [закрито]


15

Виклик

Створіть GUI-клавіатуру з якомога менше символів.

Приклад

Оскільки це було завданням на одному з моїх курсів, я не можу показати вихідний код. Однак ось знімок екрана моєї клавіатури.

фортепіано

У цьому прикладі мої клавіші були типу, JButtonі я використовував синтезатор Midi для видачі звуку (із значеннями ADDR-конверти за замовчуванням).

Правила

  • Вам дозволяється використовувати стандартні зовнішні бібліотеки.
  • Будьте креативні зі своїм звуком. Можна використовувати 8-біт, ситар і т.д.
  • Для простоти у вас може бути п'ять клавіш; чорно-білі, від С до Е (перші п’ять клавіш на моїй клавіатурі).
  • Найголовніше ... демонструйте свою роботу!

УВАГА : Залежно від того, якою мовою ви вирішите працювати, це може бути досить великим завданням.

Це моє перше питання щодо SE Code Golf. Якщо щось незрозуміле, будь ласка, попросіть детальнішу інформацію.


РЕДАКТУВАННЯ : Термін для цього виклику буде 22.09.12. Якщо ви опублікуєте відповідь після цієї дати, я перегляну її незалежно (і, можливо, поставити +1).


2
Тут обмеження щодо використання мови не дуже подобаються. Спробуйте скасувати обмеження або назвати важливу причину.
FUZxxl

1
@FUZxxl Як зазначено в розділі Приклад, це був терміновий проект для нашого класу Java. Він все ще використовується як терміновий проект для самого класу. Але я вважаю, що я просто параноїк, тому я скасую обмеження. Я думаю, ти мав на увазі, які мови не використовувати ... але що б я не видалив.
Роб

2
Які мінімальні вимоги слід вважати "клавіатурою GUI"? Я випливаю з того, що вже є, що він повинен відображати графічний інтерфейс і видавати певний звук, але які обмеження існують щодо: а) механізму введення; б) звукова оболонка; в) масштаб, що використовується; г) точність настройки; д) пропорції клавіш?
Пітер Тейлор

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

велика клавіатура


1
+1 Я не сумніваюся, що це спрацює ... Я просто хочу, щоб я міг грати на цьому.
Роб

1
Я залишив .cdf версію файлу в своєму DropBox за адресою dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5 Ви можете поділитися цим з іншими. Не повинно виникнути проблем з ліцензуванням, оскільки воно використовується для некомерційних, освітніх цілей. Вам потрібно буде завантажити безкоштовний програвач CDF Wolfram, якщо у вас його ще немає.
DavidC

Девіде, мені потрібно w = {67, 300}отримати твій результат; будь-яка ідея, чому різниця? Також, чи можу я відредагувати цей код, щоб скоротити його, якщо я в змозі?
Mr.Wizard

Містер Чарівник. w = {67,300}працює чудово у версії 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>

1
+1 Добре працює у Firefox 15, хоча я вибрав би краще звучання.
DavidC

6

Groovy: 577 (703 з пробілами)

Перші 5 приміток. Інші можна додати легко, це дещо динамічно.

Чорт гойдалки. Напевно, з розмахуючим ліпцем було б краще.

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

Грає через JFugue.

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

На 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
  }
}

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

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

Безголівки:

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