สร้าง GUI Piano [ปิด]


15

ท้าทาย

สร้างคีย์บอร์ด GUI ที่มีอักขระน้อยที่สุด

ตัวอย่าง

เนื่องจากนี่เป็นงานที่มอบหมายในหนึ่งในหลักสูตรของฉันฉันจึงไม่สามารถแสดงซอร์สโค้ดได้ อย่างไรก็ตามนี่คือภาพหน้าจอของแป้นพิมพ์ของฉัน

เปียโน

ในตัวอย่างนี้กุญแจของฉันเป็นประเภทJButtonและฉันใช้ Midi Synthesizer เพื่อสร้างเสียง (ด้วยค่าเริ่มต้นของซอง ADSR)

กฎระเบียบ

  • คุณได้รับอนุญาตให้ใช้ไลบรารีภายนอกมาตรฐาน
  • สร้างสรรค์กับเสียงของคุณ คุณสามารถใช้ 8 บิต sitar ฯลฯ
  • เพื่อความง่ายคุณอาจมีห้าปุ่ม; ขาวดำจาก C ถึง E (ห้าปุ่มแรกบนแป้นพิมพ์)
  • ที่สำคัญที่สุดคือ ... แสดงงานของคุณ!

ข้อสังเกต : อาจเป็นงานที่มีขนาดค่อนข้างใหญ่ทั้งนี้ขึ้นอยู่กับภาษาที่คุณเลือกใช้

นี่เป็นคำถามแรกของฉันเกี่ยวกับ SE Code Golf หากมีสิ่งใดไม่ชัดเจนโปรดสอบถามรายละเอียดเพิ่มเติม


แก้ไข : วันที่ครบกำหนดสำหรับความท้าทายนี้จะเป็น 9/22/12 หากคุณโพสต์คำตอบหลังจากวันที่นี้ฉันจะตรวจสอบโดยไม่คำนึงถึง (และอาจเป็น +1)


2
ข้อ จำกัด ในการใช้ภาษาที่ไม่ชอบมากที่นี่ ลองทิ้งข้อ จำกัด ของคุณหรือตั้งชื่อด้วยเหตุผลสำคัญ
FUZxxl

1
@FUZxxl ตามที่ระบุไว้ในส่วนตัวอย่างนี่เป็นโครงการระยะเวลาสำหรับคลาส Java ของเรา มันยังคงถูกใช้เป็นโครงการคำสำหรับชั้นเรียนนั้น แต่ฉันคิดว่าฉันแค่หวาดระแวงดังนั้นฉันจะทิ้งข้อ จำกัด ฉันคิดว่าคุณหมายถึงภาษาที่ไม่ควรใช้ ... แต่อะไรก็ตามฉันก็ลบมันออกไป
Rob

2
ข้อกำหนดขั้นต่ำสุดที่ต้องพิจารณาคือ "แป้นพิมพ์ GUI" คืออะไร ฉันอนุมานจากสิ่งที่มีอยู่แล้วว่าจะต้องแสดง GUI และสร้างเสียง แต่มีข้อ จำกัด อะไรบ้าง: ก) กลไกการป้อนข้อมูล; b) ซองเสียง c) ขนาดที่ใช้ d) ความแม่นยำของการจูน; e) สัดส่วนของกุญแจ?
Peter Taylor

2
@ MikeDtrick ที่ตอบคำถามของฉันได้ 5/5 ฉันไม่ได้ถามว่าการติดตั้งของคุณทำงานอย่างไร: ฉันถามว่าฉันจะรู้ได้อย่างไรว่าการติดตั้งของฉัน (สมมุติ) เป็นคู่แข่งที่ถูกต้องหรือไม่เพราะไม่มีประเด็นใดที่ทำให้รายการสั้นลง 20% ถ้าเป็นเช่นนั้น อันที่ไม่ถูกต้อง
Peter Taylor

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 ฉันไม่มีข้อสงสัยในใจว่านี่จะได้ผล ... ฉันแค่หวังว่าฉันจะได้เล่นมัน
Rob

1
ฉันออกจากไฟล์. cdf เวอร์ชันใน DropBox ของฉันที่dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5 คุณสามารถแบ่งปันสิ่งนี้กับผู้อื่นได้ ไม่ควรมีปัญหาสิทธิ์ใช้งานเนื่องจากเป็นการนำไปใช้เพื่อวัตถุประสงค์ที่ไม่ใช่เชิงพาณิชย์และเพื่อการศึกษา คุณจะต้องดาวน์โหลดเครื่องเล่น Wolfram CDF ฟรีหากคุณยังไม่มี
DavidC

เดวิดฉันต้องการw = {67, 300}ผลลัพธ์ของคุณ ความคิดใด ๆ ว่าทำไมแตกต่างกันอย่างไร นอกจากนี้ฉันสามารถแก้ไขรหัสนี้เพื่อย่อให้สั้นลงได้ไหมถ้าฉันสามารถ?
Mr.Wizard

Mr.Wizard w = {67,300}ทำงานได้ดีบน v. 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 บันทึกแรก สามารถเพิ่มคนอื่น ๆ ได้อย่างง่ายดายมันค่อนข้างมีชีวิตชีวา

ชิงช้า อาจมี lib แกว่งมันจะดีกว่า

ป้อนคำอธิบายรูปภาพที่นี่

เล่นผ่าน 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และแพคเกจและtuneRsplancs

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

ป้อนคำอธิบายรูปภาพที่นี่

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)
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.