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.