GUI पियानो बनाएं [बंद]


15

चुनौती

संभव के रूप में कुछ वर्णों के साथ एक जीयूआई कीबोर्ड बनाएँ।

उदाहरण

क्योंकि यह मेरे एक कोर्स में असाइनमेंट था, मैं सोर्स कोड नहीं दिखा सकता। हालाँकि, यहाँ मेरे कीबोर्ड का स्क्रीन शॉट है।

पियानो

इस उदाहरण में, मेरी कुंजी प्रकार की थी JButtonऔर मैंने ध्वनि उत्पन्न करने के लिए मिडी सिंथेसाइज़र का उपयोग किया (डिफ़ॉल्ट एडीएसआर लिफाफा मूल्यों के साथ)।

नियम

  • आपको मानक बाहरी पुस्तकालयों का उपयोग करने की अनुमति है।
  • अपनी ध्वनि के साथ रचनात्मक रहें। आप 8-बिट, एक सितार आदि का उपयोग कर सकते हैं।
  • सरलता के लिए, आपके पास पाँच कुंजी हो सकती हैं; काले और सफेद, सी से ई तक (मेरे कीबोर्ड पर पहली पांच चाबियाँ)।
  • सबसे महत्वपूर्ण ... अपने काम का प्रदर्शन!

सूचना : आप किस भाषा के साथ काम करना चाहते हैं, इसके आधार पर यह एक बड़ा काम हो सकता है।

एसई कोड गोल्फ पर यह मेरा पहला सवाल है। यदि कुछ भी स्पष्ट नहीं है, तो कृपया आगे का विवरण मांगें।


EDIT : इस चुनौती के लिए नियत तारीख 9/22/12 होगी। यदि आप इस तिथि के बाद उत्तर देते हैं, तो मैं इस पर ध्यान नहीं दूंगा (और संभवतः इसे +1 भी)।


2
जिस भाषा का उपयोग करने पर प्रतिबंध यहां बहुत पसंद नहीं किया जाता है। अपने प्रतिबंध को छोड़ने या एक महत्वपूर्ण कारण नाम पर विचार करें।
फ़ूजएक्सल

1
@FUZxxl जैसा कि उदाहरण अनुभाग के तहत कहा गया है, यह हमारे जावा वर्ग के लिए एक टर्म प्रोजेक्ट था। यह अभी भी उसी वर्ग के लिए एक शब्द परियोजना के रूप में उपयोग किया जा रहा है। लेकिन मुझे लगता है कि मैं सिर्फ पागल हूं इसलिए मैं प्रतिबंधों को छोड़ दूंगा। मुझे लगता है कि आपका मतलब था कि कौन सी भाषाओं का उपयोग नहीं करना है ... लेकिन जो भी हो, मैंने उन्हें हटा दिया।
रॉब

2
"जीयूआई कीबोर्ड" माना जाने वाली न्यूनतम आवश्यकताएं क्या हैं? मुझे लगता है कि पहले से ही मौजूद है कि यह एक जीयूआई प्रदर्शित करना चाहिए और कुछ ध्वनि का उत्पादन करना चाहिए, लेकिन इनपुट प्रणाली: क) पर क्या प्रतिबंध हैं; बी) ध्वनि लिफाफा; ग) इस्तेमाल किया गया पैमाना; घ) ट्यूनिंग की सटीकता; ई) कुंजी के अनुपात?
पीटर टेलर

2
@ मायकेड्रिक, जो मेरे प्रश्नों का 0/5 उत्तर देता है। मैं यह नहीं पूछ रहा हूं कि आपके कार्यान्वयन ने कैसे काम किया: मैं पूछ रहा हूं कि मैं कैसे जान सकता हूं कि क्या मेरा (काल्पनिक) कार्यान्वयन एक वैध प्रतियोगी है, क्योंकि 20% तक प्रविष्टि को छोटा करने का कोई मतलब नहीं है, यदि ऐसा करने से इसे वैध प्रविष्टि से लिया जाता है। एक अमान्य।
पीटर टेलर

1
@ मायिकड्रिक: उदाहरण के लिए, आपको आवश्यकता हो सकती है कि बटन बिल्कुल आपके उदाहरण के अनुसार दिखें, पिक्सेल द्वारा पिक्सेल। दूसरे चरम पर आप किसी भी प्रकार के पाँच GUI बटन की व्यवस्था कर सकते हैं।
हान

जवाबों:


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 आप दूसरों के साथ इस साझा कर सकते हैं। कोई लाइसेंस समस्या नहीं होनी चाहिए क्योंकि इसका उपयोग गैर-वाणिज्यिक, शैक्षिक उद्देश्यों के लिए किया जा रहा है। यदि आपके पास पहले से नहीं है तो आपको मुफ्त वुल्फराम सीडीएफ प्लेयर डाउनलोड करना होगा।
डेविड सेप

डेविड, मुझे w = {67, 300}आपका परिणाम प्राप्त करने की आवश्यकता है; किसी भी विचार क्यों अंतर? यदि मैं सक्षम हूं, तो क्या मैं इस कोड को संपादित कर सकता हूं?
श्री। छिपकली

Mr.Wizard। w = {67,300}v। 9 पर ठीक काम करता है इसलिए यदि आप इसे बदलना चाहते हैं, या उस मामले के लिए, किसी भी कोड को छोटा करें, ठीक आगे बढ़ें। बटन के आकार को समायोजित करना हिट या मिस हो गया था। जिन चीजों के बारे में मैं नहीं बता सकता, उनके लिए अजीब चीजें हुईं। (उदाहरण के लिए, अधिक बटन जोड़ने से मूल बटन का अनुपात प्रभावित होता है।)
डेविड १४

10

वेब पेज (840/796 अक्षर)

>>> खेलना शुरू करें (इंटरनेट एक्सप्लोरर कई कारणों से समर्थित नहीं है; Google Chrome और ओपेरा सबसे अच्छा काम करते हैं।)

मैं शायद इसे थोड़ा कम कर सकता हूं, फिर भी यह एक अच्छी शुरुआत है। निम्न स्कोर  वर्ण के साथ होने वाली सभी घटनाओं को प्रतिस्थापित करने और कीवर्ड को हटाने के बाद हैnew के बाद है, बाद का परिवर्तन Google क्रोम संगतता को तोड़ता है।

<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 है और इसे क्रोम या ओपेरा (सफारी भी काम कर सकता है) में खोलें, या खेल शुरू करने के लिए समाधान के JSBin पेज को खोलें । मैंने ट्विंकल ट्विंकल लिटिल स्टार कोड गोल्फ समस्या के लिए अपने समाधान से 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 फ़ायरफ़ॉक्स 15 में अच्छा काम करता है, हालाँकि मैंने बेहतर साउंडिंग इंस्ट्रूमेंट चुना होगा।
डेविड सीपी

6

ग्रूवी: 577 (व्हॉट्सएप के साथ 703)

पहले 5 नोट। दूसरों को आसानी से जोड़ा जा सकता है, यह कुछ हद तक गतिशील है।

धिक्कार है झूला। संभवत: स्विंग लिब के साथ यह बेहतर होगा।

यहां छवि विवरण दर्ज करें

JFugue के माध्यम से खेलता है।

जीथब पर: 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

आर - 491 वर्ण

मुझे थोड़ी देर हो गई है लेकिन मैंने कल ही इस पोस्ट को देखा।

एक मैक पर काम करता है, 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))}

यहां छवि विवरण दर्ज करें

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)
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.