Crea un piano GUI [chiuso]


15

Sfida

Crea una tastiera GUI con il minor numero di caratteri possibile.

Esempio

Poiché questo è stato un compito in uno dei miei corsi, non riesco a mostrare il codice sorgente. Tuttavia, ecco una schermata della mia tastiera.

pianoforte

In questo esempio, i miei tasti erano di tipo JButtone ho usato un sintetizzatore Midi per produrre il suono (con i valori di inviluppo ADSR predefiniti).

Regole

  • È consentito utilizzare librerie esterne standard.
  • Sii creativo con il tuo suono. Puoi usare 8 bit, un sitar, ecc.
  • Per motivi di semplicità, potresti avere cinque chiavi; in bianco e nero, dalla C alla E (i primi cinque tasti sulla mia tastiera).
  • Ancora più importante ... mostra il tuo lavoro!

AVVISO : a seconda della lingua scelta per lavorare, questo potrebbe essere un compito piuttosto grande.

Questa è la mia prima domanda su SE Code Golf. Se qualcosa non è chiaro, si prega di chiedere ulteriori dettagli.


EDIT : la data di scadenza per questa sfida sarà il 22/09/12. Se pubblichi una risposta dopo questa data, la esaminerò indipendentemente (e possibilmente +1).


2
Le restrizioni su quale lingua usare non sono molto apprezzate qui. Considera di abbandonare la tua limitazione o di nominare un motivo importante.
— FUZxxl,

1
@FUZxxl Come indicato nella sezione Esempio, questo era un termine progetto per la nostra classe Java. Viene ancora usato come progetto a termine proprio per quella classe. Ma suppongo di essere solo paranoico, quindi lascerò cadere le restrizioni. Penso che volevi dire quali lingue non usare ... ma comunque le ho rimosse.
— Rob,

2
Quali sono i requisiti minimi per essere considerati una "tastiera con interfaccia grafica"? Ne deduco da ciò che è già presente che deve visualizzare una GUI e produrre un suono, ma quali restrizioni ci sono: a) il meccanismo di input; b) l'involucro del suono; c) la scala utilizzata; d) l'accuratezza dell'accordatura; e) le proporzioni dei tasti?
— Peter Taylor,

2
@MikeDtrick, che risponde a 0/5 delle mie domande. Non sto chiedendo come ha funzionato la tua implementazione: sto chiedendo come posso sapere se la mia (ipotetica) implementazione è un concorrente valido, perché non ha senso abbreviare una voce del 20% se così facendo la prende da essere una voce valida per uno non valido.
— Peter Taylor,

1
@MikeDtrick: ad esempio, potresti richiedere che i pulsanti siano esattamente come quelli nel tuo esempio, pixel per pixel. All'altro estremo potresti consentire qualsiasi disposizione di cinque pulsanti della GUI di qualsiasi tipo.
— han

Risposte:


11

Matematica 319 259 255


Modifica: i tasti ora vengono premuti (come pulsanti) quando si fa clic.


Questo suonerà le note di pianoforte a coda {"C", "C #", "D", "D #", "E"}, dove "C" è la parte centrale C. z[n_]suona la nota.

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]

tastiera


La tastiera può essere estesa a 18 tasti utilizzando meno del doppio dei caratteri:

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

tastiera di grandi dimensioni


1
+1 Non ho dubbi sul fatto che funzionerà ... Vorrei solo che potessi giocarci.
— Rob,

1
Ho lasciato una versione .cdf del file nel mio DropBox su dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5 Puoi condividerlo con altri. Non dovrebbero esserci problemi di licenza perché viene utilizzato per scopi educativi e non commerciali. Dovrai scaricare il lettore CDF gratuito Wolfram se non lo possiedi già.
— DavidC,

David, devo w = {67, 300}ottenere il tuo risultato; qualche idea sul perché la differenza? Inoltre, posso modificare questo codice per accorciarlo, se posso?
— Mr.Wizard,

Mr.Wizard. w = {67,300}funziona bene su v. 9 quindi se vuoi cambiarlo, o per quella materia, accorcia il codice, vai avanti. La regolazione della dimensione del pulsante è stata sbagliata. Sono successe cose strane per ragioni che non posso spiegare. (Ad esempio, l'aggiunta di più pulsanti influisce sulle proporzioni dei pulsanti originali.)
— DavidC

10

Pagina Web (840/796 caratteri)

>>> Inizia a giocare (Internet Explorer non è supportato per diversi motivi; Google Chrome e Opera funzionano al meglio.)

Probabilmente potrei renderlo un po 'più breve, ma è un buon inizio. Il punteggio più basso è dopo aver sostituito tutte le occorrenze del  carattere stesso e aver rimosso la parola chiave new, quest'ultima cambia rompendo la compatibilità di 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>

Salva questo codice come file di testo con un nome che termina in .htm o .html e aprilo in Chrome o Opera (Safari potrebbe funzionare anche), oppure apri semplicemente la pagina JSBin della soluzione per iniziare a giocare. Ho riutilizzato l'intestazione del file WAV dalla mia soluzione al problema del golf con il codice Twinkle Twinkle Little Star .

Una caratteristica importante è che il suono diminuisce con il passare del tempo. Per osservare questo comportamento, prova a tenere premuto un tasto per alcuni secondi e ascolta cosa succede.

Ecco una versione più leggibile del codice:

<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 Funziona bene in Firefox 15, anche se avrei scelto uno strumento dal suono migliore.
— DavidC,

6

Groovy: 577 (703 con spazi bianchi)

Le prime 5 note. Altri potrebbero essere aggiunti facilmente, è in qualche modo dinamico.

Dannazione altalena. Probabilmente con una lib swing sarebbe meglio.

inserisci qui la descrizione dell'immagine

Riproduce attraverso JFugue.

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

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

Sono un po 'in ritardo ma ho visto questo post ieri.

Funziona su un Mac, utilizza playRWave e pacchetti tuneRe 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))}

inserisci qui la descrizione dell'immagine

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)
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.