创建GUI钢琴[关闭]


15

挑战

用最少的字符创建一个GUI键盘。

因为这是我的一门课程中的一项作业,所以我无法显示源代码。但是,这是我的键盘的屏幕截图。

钢琴

在此示例中,我的键属于类型JButton,我使用Midi合成器产生声音(具有默认的ADSR包络值)。

规则

  • 被允许使用标准的外部库。
  • 发挥您的声音创意。您可以使用8位,西塔琴等。
  • 为简单起见,您可能有五个键;黑白,从C到E(键盘上的前五个键)。
  • 最重要的是……展示您的作品!

注意:根据您选择使用的语言,这可能是一项相当大的任务。

这是我对SE Code Golf的第一个问题。如果不清楚,请询问更多细节。


编辑:此挑战的截止日期将为9/22/12。如果您在此日期之后发布答案,无论如何(可能对其+1),我都会对其进行检查。


2
这里不太喜欢使用哪种语言的限制。考虑放弃限制或命名是重要原因。
FUZxxl 2012年

1
@FUZxxl如“示例”部分所述,这是Java类的术语项目。它仍被用作该类的术语项目。但是我想我只是偏执狂,所以我放弃了限制。我认为您的意思是不使用哪种语言...但是无论如何,我删除了它们。
罗布

2
被视为“ GUI键盘”的最低要求是什么?我从已经存在的内容中推断出它必须显示一个GUI并产生一些声音,但是存在以下限制:a)输入机制;b)声音包络;c)使用的规模;d)调整的准确性;e)按键的比例?
彼得·泰勒

2
@MikeDtrick,它回答了我的问题的0/5。我不是在问您的实现是如何工作的:我是在问我如何知道我的(假设的)实现是否是有效的竞争对手,因为这样做没有必要将输入从有效输入缩短为20%。无效的。
彼得·泰勒

1
@MikeDtrick:例如,您可能要求按钮的外观与示例中的按钮完全相同,逐像素。在另一个极端,您可以允许任何类型的五个GUI按钮的任何排列。
2012年

Answers:


11

数学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我毫不怀疑这会起作用...我只是希望自己能继续玩下去。
罗布

1
我在在DropBox的离开了文件的.CDF版本dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5 您可以与他人分享。应该没有许可问题,因为它被用于非商业,教育目的。如果您还没有免费的Wolfram CDF播放器,则需要下载它。
DavidC 2012年

大卫,我需要w = {67, 300}得到你的结果。知道为什么会有区别吗?另外,如果可以,我可以编辑此代码以缩短代码吗?
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 2012年

6

Groovy:577(带空格的703)

前5个音符。其他可以轻松添加,有些动态。

该死的秋千。也许有秋千库会更好。

在此处输入图片说明

通过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以及package 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))}

在此处输入图片说明

取消高尔夫:

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)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.