Buat GUI Piano [ditutup]

15

Tantangan

Buat GUI Keyboard dengan karakter sesedikit mungkin.

Contoh

Karena ini adalah tugas di salah satu program saya, saya tidak dapat menunjukkan kode sumbernya. Namun, ini adalah screenshot dari keyboard saya.

piano

Dalam contoh ini, kunci saya bertipe JButtondan saya menggunakan Midi Synthesizer untuk menghasilkan suara (dengan nilai amplop ADSR default).

Aturan

  • Anda diizinkan menggunakan perpustakaan eksternal standar.
  • Jadilah kreatif dengan suara Anda. Anda dapat menggunakan 8-bit, sebuah sitar, dll.
  • Sederhananya, Anda mungkin memiliki lima kunci; hitam dan putih, dari C ke E (lima tombol pertama pada keyboard saya).
  • Yang terpenting ... perlihatkan karya Anda!

PEMBERITAHUAN : Bergantung pada bahasa apa yang Anda pilih untuk bekerja, ini mungkin tugas yang agak besar.

Ini adalah pertanyaan pertama saya di SE Code Golf. Jika ada yang tidak jelas, silakan tanyakan rincian lebih lanjut.


EDIT : Tanggal jatuh tempo untuk tantangan ini adalah 9/22/12. Jika Anda mengirim jawaban setelah tanggal ini, saya akan mencarinya terlepas (dan mungkin memberi +1).

rampok
sumber
2
Pembatasan yang menggunakan bahasa tidak disukai di sini. Pertimbangkan untuk menjatuhkan batasan atau nama alasan penting.
FUZxxl
1
@FUZxxl Seperti yang dinyatakan di bagian Contoh, ini adalah proyek istilah untuk kelas Java kami. Itu masih digunakan sebagai proyek jangka untuk kelas itu. Tapi saya kira saya hanya paranoid jadi saya akan membatalkan batasannya. Saya pikir Anda maksudkan bahasa mana yang tidak boleh digunakan ... tapi apa pun, saya menghapusnya.
Rob
2
Apa persyaratan minimal untuk dianggap sebagai "keyboard GUI"? Saya menyimpulkan dari apa yang sudah ada bahwa itu harus menampilkan GUI dan menghasilkan beberapa suara, tetapi pembatasan apa yang ada pada: a) mekanisme input; b) amplop suara; c) skala yang digunakan; d) ketepatan penyetelan; e) proporsi kunci?
Peter Taylor
2
@ MikeDtrick, itu menjawab 0/5 pertanyaan saya. Saya tidak bertanya bagaimana implementasi Anda bekerja: Saya bertanya bagaimana saya bisa tahu apakah implementasi (hipotetis) saya adalah pesaing yang valid, karena tidak ada gunanya mempersingkat entri sebesar 20% jika hal itu mengambilnya dari menjadi entri yang valid untuk yang tidak valid.
Peter Taylor
1
@MikeDtrick: Misalnya, Anda dapat meminta agar tombolnya terlihat persis seperti yang ada di contoh Anda, piksel demi piksel. Di sisi lain, Anda dapat mengizinkan pengaturan lima tombol GUI apa pun.
han

Jawaban:

11

Mathematica 319 259 255


Sunting: Tombol sekarang ditekan (sebagai tombol) saat diklik.


Ini akan memainkan nada grand piano {"C", "C #", "D", "D #", "E"}, di mana "C" berada di tengah C. z[n_]memainkan nada.

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]

papan ketik


Keyboard dapat diperpanjang menjadi 18-tombol dengan menggunakan karakter kurang dari dua kali lipat:

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

keyboard besar

DavidC
sumber
1
+1 Saya tidak ragu dalam pikiran saya bahwa ini akan berhasil ... Saya hanya berharap saya bisa bermain di atasnya.
Rob
1
Saya meninggalkan versi .cdf file di DropBox saya di dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5 Anda dapat berbagi ini dengan orang lain. Seharusnya tidak ada masalah lisensi karena digunakan untuk tujuan pendidikan non-komersial. Anda perlu mengunduh pemutar Wolfram CDF gratis jika Anda belum memilikinya.
DavidC
David, saya perlu w = {67, 300}mendapatkan hasil Anda; tahu mengapa bedanya? Juga, bolehkah saya mengedit kode ini untuk mempersingkatnya, jika saya bisa?
Mr.Wizard
Tuan Wisaya. w = {67,300}berfungsi dengan baik pada ay. 9 jadi jika Anda ingin mengubahnya, atau dalam hal ini, persingkat salah satu kode, silakan saja. Menyesuaikan ukuran tombol terkena atau gagal. Hal-hal aneh terjadi karena alasan yang tidak dapat saya jelaskan. (Misalnya, menambahkan lebih banyak tombol memengaruhi proporsi tombol aslinya.)
DavidC
10

Halaman web (840/796 karakter)

>>> Mulai bermain (Internet Explorer tidak didukung karena berbagai alasan; Google Chrome dan Opera berfungsi paling baik.)

Saya mungkin bisa membuat ini sedikit lebih pendek, namun ini adalah awal yang baik. Skor yang lebih rendah adalah setelah mengganti semua kemunculan  dengan karakter itu sendiri dan menghapus kata kunci new, perubahan yang terakhir melanggar kompatibilitas 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>

Simpan kode ini sebagai file teks dengan nama yang berakhiran .htm atau .html dan buka di Chrome atau Opera (Safari mungkin juga berfungsi), atau cukup buka halaman JSBin solusi untuk mulai bermain. Saya menggunakan kembali header file WAV dari solusi saya ke masalah golf kode Twinkle Twinkle Little Star .

Fitur penting adalah bahwa suara berkurang seiring berjalannya waktu. Untuk mengamati perilaku ini, coba tahan tombol selama beberapa detik dan dengarkan apa yang terjadi.

Ini adalah versi kode yang lebih mudah dibaca:

<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
sumber
1
+1 Berfungsi bagus di Firefox 15, meskipun saya akan memilih instrumen yang terdengar lebih baik.
DavidC
6

Groovy: 577 (703 dengan spasi putih)

5 catatan pertama. Orang lain dapat ditambahkan dengan mudah, ini agak dinamis.

Ayunan sialan. Mungkin dengan ayunan lib akan lebih baik.

masukkan deskripsi gambar di sini

Dimainkan melalui JFugue.

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

Pada asyik 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
  }
}
Will Lp
sumber
1

R - 491 karakter

Saya sedikit terlambat tetapi saya baru melihat posting ini kemarin.

Bekerja pada Mac, menggunakan playRWave dan paket tuneRdan 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))}

masukkan deskripsi gambar di sini

Tidak Disatukan:

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
sumber