GUI Piyano Oluşturma [kapalı]


15

Meydan okuma

Mümkün olduğunca az karakter içeren bir GUI Klavye oluşturun.

Misal

Bu kurslarımdan birinde bir ödev olduğu için kaynak kodunu gösteremiyorum. Ancak, işte klavyemin ekran görüntüsü.

piyano

Bu örnekte, anahtarlarım JButtontüründeydi ve sesi üretmek için bir Midi Synthesizer kullandım (varsayılan ADSR zarf değerleriyle).

kurallar

  • Standart harici kütüphaneleri kullanma izniniz var .
  • Sesinizle yaratıcı olun. 8 bit, sitar vb. Kullanabilirsiniz.
  • Sadelik için beş anahtarınız olabilir; siyah beyaz, C'den E'ye (klavyemdeki ilk beş tuş).
  • En önemlisi ... işinizi sergileyin!

DİKKAT : Hangi dilde çalışmayı seçtiğinize bağlı olarak, bu oldukça büyük bir görev olabilir.

Bu SE Code Golf ile ilgili ilk sorum. Net olmayan bir şey varsa, lütfen daha fazla ayrıntı isteyin.


EDIT : Bu meydan okuma için son tarih 22.09.2012 olacaktır. Bu tarihten sonra bir cevap gönderirseniz, ne olursa olsun ona bakacağım (ve muhtemelen + 1'leyeceğim).


2
Hangi dilin kullanılacağına dair kısıtlamalar burada pek beğenilmiyor. Kısıtlılığınızı veya adınızı önemli bir nedenden düşürmeyi düşünün.
FUZxxl

1
@FUZxxl Örnek bölümünde belirtildiği gibi, bu Java sınıfımız için bir dönem projesiydi. Halen bu sınıf için bir dönem projesi olarak kullanılmaktadır. Ama sanırım sadece paranoyak olduğum için kısıtlamaları bırakacağım. Sanırım hangi dillerin kullanılmayacağını kastediyorsun ... ama her neyse onları kaldırdım.
Rob

2
"GUI klavyesi" olarak düşünülmesi gereken minimum gereksinimler nelerdir? Bir GUI görüntülemesi ve biraz ses üretmesi gerektiğini zaten mevcut olanlardan çıkarıyorum, ancak üzerinde hangi kısıtlamalar var: a) giriş mekanizması; b) ses zarfı; c) kullanılan ölçek; d) ayarın doğruluğu; e) anahtarların oranları?
Peter Taylor

2
@MikeDtrick, sorularımın 0 / 5'ine cevap veriyor. Uygulamanızın nasıl çalıştığını sormuyorum: (Varsayımsal) uygulamamın geçerli bir rakip olup olmadığını nasıl anlayabileceğimi soruyorum, çünkü bunu yapmak geçerli bir giriş olmaktan çıkarırsa bir girişi% 20 kısaltmanın bir anlamı yoktur. geçersiz.
Peter Taylor

1
@MikeDtrick: Örneğin, düğmelerin örneğinizdeki piksele piksele benzemesini isteyebilirsiniz. Diğer uçta, herhangi bir türde beş GUI düğmesinin düzenlenmesine izin verebilirsiniz.
han

Yanıtlar:


11

Mathematica 319 259 255


Düzenle: Tuşlar artık tıklatıldığında (düğmeler olarak) basılır.


Bu, "C" nin orta C olduğu piyano notalarını {"C", "C #", "D", "D #", "E"} çalacaktır 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]

tuş takımı


Klavye, iki kattan daha az karakter kullanılarak 18 tuşa kadar genişletilebilir:

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

büyük klavye


1
+1 Bunun işe yarayacağından şüphem yok ... Keşke oynayabilsem.
Rob

1
Dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5 adresindeki DropBox'ımda dosyanın bir .cdf sürümünü bıraktım. Bunu başkalarıyla paylaşabilirsiniz. Ticari olmayan, eğitim amaçlı kullanıldığı için lisanslama problemleri olmamalıdır. Henüz sahip değilseniz, ücretsiz Wolfram CDF oynatıcısını indirmeniz gerekecektir.
DavidC

David, w = {67, 300}sonucunu almam gerek ; herhangi bir fikir neden fark? Ayrıca, eğer yapabilirsem kısaltmak için bu kodu düzenleyebilir miyim?
Mr.Wizard

Mr.Wizard. w = {67,300}v. 9 üzerinde iyi çalışır, bu yüzden değiştirmek isterseniz veya bu nedenle kodlardan herhangi birini kısaltın, hemen devam edin. Düğme boyutunu ayarlamak vuruldu ya da özlendi. Açıklayamadığım nedenlerle garip şeyler oldu. (Örneğin, daha fazla düğme eklemek orijinal düğmelerin oranlarını etkiler.)
DavidC

10

Web sayfası (840/796 karakter)

>>> Oynatmaya başlayın (Internet Explorer birden fazla nedenden dolayı desteklenmez; Google Chrome ve Opera en iyi şekilde çalışır.)

Muhtemelen bunu biraz daha kısaltabilirdim, ama iyi bir başlangıç. Daha düşük puan, tüm oluşumları  karakterin kendisiyle newdeğiştirdikten ve anahtar kelimeyi kaldırdıktan sonra , ikinci değişiklik Google Chrome uyumluluğunu bozar.

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

Bu kodu .htm veya .html ile biten bir metin dosyası olarak kaydedin ve Chrome veya Opera'da (Safari de işe yarayabilir) açın veya oynatmaya başlamak için çözümün JSBin sayfasını açın . WAV dosya başlığını çözümümden Twinkle Twinkle Little Star kodu golf sorununa tekrar kullandım.

Önemli bir özellik, zaman geçtikçe sesin azalmasıdır. Bu davranışı gözlemlemek için, bir tuşu birkaç saniye basılı tutup ne olduğunu dinlemeyi deneyin.

İşte kodun daha okunabilir bir sürümü:

<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 Daha iyi bir ses enstrümanı seçmiş olsam da Firefox 15'te iyi çalışıyor.
DavidC

6

Harika: 577 (beyaz boşluklu 703)

İlk 5 not. Diğerleri kolayca eklenebilir, biraz dinamik.

Kahretsin salıncak. Muhtemelen bir salıncak lib ile daha iyi olurdu.

resim açıklamasını buraya girin

JFugue ile oynar.

Github'da: https://github.com/wpiasecki/glissando/blob/master/src/br/glissando/Piano.groovy

Harika 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 karakter

Biraz geç kaldım ama dün bu yazıyı gördüm.

Mac'te İşleri kullanır playRWave ve paketleri tuneRve 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))}

resim açıklamasını buraya girin

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)
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.