GUIピアノの作成[終了]


15

チャレンジ

できるだけ少ない文字でGUIキーボードを作成します。

これは私のコースの1つの課題であったため、ソースコードを表示できません。ただし、ここに私のキーボードのスクリーンショットがあります。

ピアノ

この例では、キーはタイプでJButtonあり、Midi Synthesizerを使用してサウンドを生成しました(デフォルトのADSRエンベロープ値を使用)。

ルール

  • あなたは許可されている標準の外部ライブラリを使用します。
  • サウンドで創造的になります。8ビット、シタールなどを使用できます。
  • 簡単にするために、5つのキーがある場合があります。白黒、CからE(キーボードの最初の5つのキー)。
  • 最も重要なことは...あなたの仕事を紹介することです!

注意:使用する言語の選択によっては、これはかなり大きな作業になる場合があります。

これはSE Code Golfに関する私の最初の質問です。不明な点がある場合は、詳細をお問い合わせください。


編集:このチャレンジの期日は9/22/12になります。この日付の後に回答を投稿した場合、私は関係なくそれを調べます(そしておそらくそれを+1します)。


2
使用する言語の制限はここではあまり好まれていません。制限を解除するか、重要な理由を挙げてください。
-FUZxxl

1
@FUZxxl例のセクションで述べたように、これはJavaクラスの用語プロジェクトでした。そのクラスの用語プロジェクトとしてまだ使用されています。しかし、私はただの妄想だと思うので、制限を解除します。あなたはどの言語を使わないかを意味していたと思います...しかし、私はそれらを削除しました。
ロブ

2
「GUIキーボード」と見なされる最小要件は何ですか?すでに存在するものから、GUIを表示してサウンドを生成する必要があると推測しますが、次のような制限があります。a)入力メカニズム。b)サウンドエンベロープ。c)使用されるスケール。d)チューニングの精度。e)キーの比率?
ピーターテイラー

2
@MikeDtrick、それは私の質問の0/5に答えます。私はあなたの実装がどのように機能したのかを尋ねていません:私の(仮想の)実装が有効な競争相手であるかどうかをどのように知ることができるかを尋ねています無効なもの。
ピーターテイラー

1
@MikeDtrick:たとえば、ボタンがピクセルごとに、例のボタンとまったく同じように見えることを要求できます。他の極端な場合は、任意のタイプの5つのGUIボタンの配置を許可できます。
ハン

回答:


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]

キーボード


キーボードは、2倍未満の文字を使用して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.com/sh/m3y0fs0v0nidqt5/UTv_0YGpz5の DropBoxにファイルの.cdfバージョンを残しました 。これを他のユーザーと共有できます。非商用の教育目的で使用されているため、ライセンスの問題はないはずです。まだお持ちでない場合は、無料のWolfram CDFプレーヤーをダウンロードする必要があります。
DavidC

デビッド、w = {67, 300}あなたの結果を取得する必要があります。なぜ違いがあるのか​​?また、可能であれば、このコードを編集して短縮することはできますか?
ミスターウィザード

ウィザードさん。 w = {67,300}v。9で正常に動作するため、変更したい場合、またはコードを短くしたい場合は、先に進んでください。ボタンサイズの調整がヒットまたはミスしました。説明できない理由で奇妙なことが起こりました。(たとえば、ボタンを追加すると元のボタンの比率に影響します。)
DavidC

10

Webページ(840/796文字)

>>> 再生を開始します(Internet Explorerは複数の理由でサポートされていません。GoogleChromeと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ページを開いて再生を開始します。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

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およびパッケージtuneRとを使用します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))}

ここに画像の説明を入力してください

ゴルフをしていない:

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.