GUI 피아노 만들기 [닫기]


15

도전

가능한 적은 문자로 GUI 키보드를 작성하십시오.

이것은 내 코스 중 하나에서 과제 였으므로 소스 코드를 보여줄 수 없습니다. 그러나 여기 내 키보드의 스크린 샷이 있습니다.

피아노

이 예에서는 키가 종류 JButton였으며 Midi Synthesizer를 사용하여 사운드를 생성했습니다 (기본 ADSR 엔벨로프 값 사용).

규칙

  • 표준 외부 라이브러리를 사용할 수 있습니다 .
  • 소리에 창의성을 발휘하십시오. 8 비트, 시타르 등을 사용할 수 있습니다.
  • 간단히하기 위해 다섯 개의 키가있을 수 있습니다. C에서 E까지 (키보드의 첫 5 개 키) 흑백입니다.
  • 가장 중요한 것은 ... 당신의 작품을 보여주십시오!

주의 사항 : 어떤 언어를 사용하기로 선택 하느냐에 따라 다소 큰 과제가 될 수 있습니다.

이것은 SE Code Golf에 대한 첫 번째 질문입니다. 불분명 한 것이 있으면 자세한 내용을 문의하십시오.


편집 :이 도전의 마감일은 9/22/12입니다. 이 날짜 이후에 답변을 게시하면 관계없이 살펴보고 +1합니다.


2
어떤 언어를 사용할 것인지에 대한 제한은 여기서 매우 좋아하지 않습니다. 제한을 철회하거나 중요한 이유를 생각해보십시오.
FUZxxl

1
@FUZxxl 예제 섹션에서 언급했듯이 이는 Java 클래스의 프로젝트라는 용어입니다. 그것은 여전히 ​​그 클래스의 용어 프로젝트로 사용되고 있습니다. 그러나 나는 단지 편집증이라고 가정하고 제한을 철회 할 것입니다. 나는 당신이 어떤 언어 를 사용하지 말아야 하는지 생각 하지만 ...
Rob

2
"GUI 키보드"로 간주되는 최소 요구 사항은 무엇입니까? 나는 이미 존재하는 것에서 GUI를 표시하고 소리를 낼 필요가 있지만 어떤 제한이 있습니까? b) 사운드 엔벨로프; c) 사용 된 규모; d) 튜닝의 정확성 e) 열쇠의 비율?
피터 테일러

2
@ MikeDtrick, 내 질문의 0/5에 답합니다. 구현이 어떻게 작동했는지 묻지 않습니다. (가상) 구현이 유효한 경쟁자인지 어떻게 알 수 있는지 묻고 있습니다. 유효한 엔트리가 아닌 경우 엔트리를 20 % 단축 할 수 없기 때문입니다 유효하지 않은 것.
피터 테일러

1
@ MikeDtrick : 예를 들어, 버튼이 예제의 버튼과 정확히 일치하도록 요구할 수 있습니다. 다른 극단적 인 경우 모든 유형의 GUI 버튼 5 개를 배열 할 수 있습니다.

답변:


11

Mathematica 319 259 255


편집 : 클릭하면 키가 버튼으로 눌러집니다.


그랜드 피아노 음표 { "C", "C #", "D", "D #", "E"}를 z[n_]연주합니다 . 여기서 "C"는 중간 C 입니다.

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
dropbox.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5의 DropBox에 파일의 .cdf 버전을 남겼 습니다. 다른 사람과 공유 할 수 있습니다. 비영리적인 교육 목적으로 사용되므로 라이센스 문제가 없어야합니다. 아직없는 경우 무료 Wolfram CDF 플레이어를 다운로드해야합니다.
DavidC

데이빗, w = {67, 300}결과를 얻어야 해요 . 왜 차이점이 있을까요? 또한 가능한 경우이 코드를 편집하여 단축 할 수 있습니까?
Mr.Wizard

미스터 위자드 w = {67,300}v. 9에서 잘 작동하므로 변경하거나 문제를 해결하려면 코드를 줄이십시오. 버튼 크기 조정이 맞았거나 누락되었습니다. 내가 설명 할 수없는 이유로 이상한 일이 일어났다. (예를 들어, 버튼을 더 추가하면 원래 버튼의 비율에 영향을 미칩니다.)
DavidC

10

웹 페이지 (840/796 자)

>>> 재생 시작 (여러 가지 이유로 Internet Explorer가 지원되지 않으며 Chrome 및 Opera가 가장 효과적입니다.)

아마 이것을 조금 더 짧게 만들 수는 있지만 좋은 출발입니다. 낮은 점수는 모든 항목을  문자 자체로 교체 하고 키워드를 제거한 new후 후자의 변경으로 인해 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 페이지 를 열어 재생을 시작 하십시오 . 솔루션에서 Twinkle Twinkle Little Star 코드 골프 문제에 이르기까지 WAV 파일 헤더를 재사용했습니다 .

중요한 특징은 시간이 지남에 따라 소리가 줄어든다는 것입니다. 이 동작을 관찰하려면 몇 초 동안 키를 누른 상태에서 발생하는 내용을 들어보십시오.

보다 읽기 쉬운 코드 버전은 다음과 같습니다.

<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

그루비 : 577 (공백이있는 703)

처음 5 개 노트 다른 것들은 쉽게 추가 될 수 있으며 다소 역동적입니다.

젠장 아마도 스윙 라이브러리를 사용하는 것이 좋습니다.

여기에 이미지 설명을 입력하십시오

JFugue를 통해 재생합니다.

github에서 : https://github.com/wpiasecki/glissando/blob/master/src/br/glissando/Piano.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))}

여기에 이미지 설명을 입력하십시오

언 골프 드 :

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.