मैंने सालों में कोई भी MIDI प्रोग्रामिंग नहीं की है, लेकिन आपका मौलिक विचार बहुत ही अच्छा है (कोई सज़ा नहीं)।
मिडी "घटनाओं" (या "संदेश") की एक धारा है, दो सबसे मौलिक "नोट पर" और "नोट ऑफ" हैं, जो उनके साथ नोट संख्या (0 = C पांच सप्तक के मध्य C के नीचे, 127 = के माध्यम से ले जाते हैं) G पाँच सप्तक ऊपर G के मध्य C के ऊपर, अर्ध-स्वर में)। ये इवेंट 0 और 127 के बीच के बल के साथ ("टच सेंसिटिव") होने वाले की-बोर्ड पर "वेग" की संख्या रखते हैं, जो संवेदनशील ("टच सेंसिटिव") है।
वेग, चॉजिंग और पैडल के बीच, मुझे लगता है कि आप पियानो कीबोर्ड के लिए काफी अच्छे "टाइपिंग" इंटरफेस के साथ आ सकते हैं। विशेष रूप से रिकॉर्डिंग एक बहुत ही शक्तिशाली तकनीक हो सकती है - जैसा कि मैंने टिप्पणियों में उल्लेख किया है, यही कारण है कि रैंक-एंड-फाइल स्टेनोग्राफर एक स्टेनोग्राफी मशीन का उपयोग करके लोगों के साथ लगातार घंटों बात कर सकते हैं, जब यहां तक कि टॉप-फ्लाइट टाइपिस्ट भी होते हैं ' t सामान्य टाइपराइटर-स्टाइल कीबोर्ड के माध्यम से किसी भी लम्बाई के लिए सक्षम हो। मशीन आशुलिपि की तरह, आपको chords के क्रम और क्रम के "शब्दकोश" की आवश्यकता होगी। (क्या आप बता सकते हैं कि मैं मशीन स्टेनोग्राफी के सॉफ्टवेयर साइड में काम करता था?)
ऐसा करने के लिए, मौलिक टुकड़े हैं:
- मिडी इनपुट प्राप्त करना। अपने आप को ऐसा करने की कोशिश मत करो, एक पुस्तकालय का उपयोग करें। संपादित करें : जाहिरा तौर पर, जावा साउंड एपीआई MIDI का समर्थन करता है , जिसमें MIDI नियंत्रकों से घटनाओं को प्राप्त करना शामिल है। ठंडा। यह पृष्ठ उपयोगी भी हो सकता है।
- उस डेटा को कीस्ट्रोक्स में परिवर्तित करना जिसे आप उपर्युक्त शब्दकोश के माध्यम से भेजना चाहते हैं।
- कंप्यूटर को कीस्ट्रोक्स का आउटपुट देना।
सॉफ़्टवेयर के साथ सबसे व्यापक रूप से संगत होने के लिए, आपको इसे कीबोर्ड डिवाइस ड्राइवर के रूप में लिखना होगा। यह एक प्लग-इन ऑपरेटिंग सिस्टम है जो कीबोर्ड घटनाओं के लिए एक स्रोत के रूप में कार्य करता है, अंतर्निहित हार्डवेयर (आपके मामले में, पियानो पिक्सेल) से बात करता है। Windows और Linux के लिए, आप शायद इसके लिए C का उपयोग करना चाहते हैं।
हालाँकि, चूंकि आप सिर्फ कीस्ट्रोक्स उत्पन्न कर रहे हैं (उन्हें अवरोधन करने की कोशिश नहीं कर रहे हैं, जो मैं वर्षों पहले करना चाहता था), आप कृत्रिम कीस्ट्रोक्स भेजने के लिए ऑपरेटिंग सिस्टम की जो भी सुविधाएँ हैं, उनका उपयोग करने में सक्षम हो सकते हैं। विंडोज में ऐसा करने के लिए एक इंटरफ़ेस है (शायद कई, जो मैं सोच रहा हूं, SendInput
लेकिन मुझे पता है कि कुछ "पत्रिका" इंटरफ़ेस है जो कुछ ऐसा ही करता है), और मुझे यकीन है कि अन्य ऑपरेटिंग सिस्टम भी करते हैं। यह अच्छी तरह से आपके उद्देश्यों के लिए पर्याप्त हो सकता है - यह वह जगह है जहां मैं शुरू करूंगा, क्योंकि डिवाइस ड्राइवर मार्ग अजीब होने वाला है और आपको संभवतः जावा की तुलना में इसके लिए एक अलग भाषा का उपयोग करना होगा। (मैं जावा का बहुत बड़ा प्रशंसक हूं, लेकिन डिवाइस ड्राइवरों से बात करने के लिए ऑपरेटिंग सिस्टम का उपयोग करने वाले इंटरफेस सी और इसी तरह की अधिक आसानी से खपत करते हैं।)
अद्यतन : कीस्ट्रोक्स को chords के "शब्दकोश" के बारे में अधिक:
मूल रूप से, शब्दकोश एक ट्राइ (धन्यवाद, @ अदम) है जिसे हम सबसे लंबे समय तक उपसर्ग मिलान के साथ खोजते हैं। विवरण:
मशीन स्टेनोग्राफी में, स्टेनोग्राफर एक ही समय पर स्टेनोटाइप मशीन पर कई कुंजियों को दबाकर लिखते हैं, फिर उन सभी को जारी करते हैं। वे इसे कीबोर्ड का "स्ट्रोक" कहते हैं; यह पियानो पर एक राग बजाने जैसा है। बार-बार स्ट्रोक (लेकिन हमेशा नहीं) बोलचाल की भाषा के एक अक्षर के अनुरूप होता है। सिलेबल्स की तरह, कभी-कभी एक स्ट्रोक (कॉर्ड) का अर्थ अपने आप ही होता है, अन्य बार इसका अर्थ केवल निम्नलिखित स्ट्रोक के साथ संयुक्त होता है। ("अच्छा" बनाम "अच्छा" सोचें और उसके बाद "अलविदा")। हालाँकि वे उस स्कूल से बहुत प्रभावित होंगे जिस पर उन्होंने अध्ययन किया था, प्रत्येक आशुलिपिक का अपना "डिक्शनरी" होगा कि वे किस स्ट्रोक का उपयोग करते हैं इसका मतलब क्या है, एक शब्दकोश जो वे अपने कामकाजी जीवन के दौरान लगातार करेंगे। डिक्शनरी में प्रविष्टियाँ होंगी जहाँ स्टेनोग्राफिक भाग ("स्टेनो", संक्षेप में) एक स्ट्रोक लंबा, या कई स्ट्रोक लंबा होता है। अक्सर, एक ही शुरुआती स्ट्रोक के साथ कई प्रविष्टियां होंगी जो उनकी लंबाई और उसके बाद के स्ट्रोक से भिन्न होती हैं। उदाहरण के लिए (और मैं यहां असली स्टेनो का उपयोग नहीं करूंगा, सिर्फ प्लेसहोल्डर), ये प्रविष्टियां हो सकती हैं:
ए = अल्फा
A / B = वर्णमाला
ए / बी / सी = अक्षरात्मक
ए / सी = एयर कंडीशनिंग
बी = मधुमक्खी
बी / सी = क्योंकि
सी = समुद्र
डी = कुत्ता
डी / डी = डी डे
(उन अक्षरों का अर्थ संगीत के नोट्स नहीं हैं, केवल सार मार्कर हैं।)
ध्यान दें कि A
कई प्रविष्टियां शुरू होती हैं, और यह भी ध्यान दें कि आप किस तरह से एक C
स्ट्रोक का अनुवाद करते हैं यह इस बात पर निर्भर करता है कि क्या आपने पहले एक देखा A
है B
, या आप नए सिरे से शुरू कर रहे हैं।
यह भी ध्यान दें कि (हालांकि बहुत छोटे नमूने में नहीं दिखाया गया है), केवल एक के बजाय एक ही शब्द या वाक्यांश को "खेलने" के कई तरीके हो सकते हैं। आशुलिपिक ऐसा करते हैं कि हाथ की स्थिति के आधार पर पूर्ववर्ती शब्द से अगले तक प्रवाह करना आसान हो जाता है। वहाँ संगीत के लिए एक स्पष्ट सादृश्य है, और आप उपयोग कर सकते हैं कि आपके टाइपिंग प्रवाह को संगीत बजाने के लिए अधिक समान बना दिया जाए, ताकि दोनों इसे अपने पियानो बजाने को नकारात्मक रूप से प्रभावित करने से रोक सकें और वास्तव में आरएसआई के साथ मदद करने की संभावना को अधिकतम करने के लिए।
स्टेनो को मानक पाठ में अनुवाद करते समय, फिर से हम "सबसे लंबे समय तक उपसर्ग मिलान" खोज का उपयोग करते हैं: अनुवाद एल्गोरिथ्म पहले लिखे गए स्ट्रोक से शुरू होता है, और उस स्ट्रोक से शुरू होने वाली प्रविष्टियों की तलाश करता है। यदि केवल एक प्रविष्टि है, और यह एक स्ट्रोक लंबा है, तो हम मज़बूती से कह सकते हैं कि "यह प्रविष्टि उपयोग करने के लिए है", संबंधित पाठ को आउटपुट करता है, और फिर अगले स्ट्रोक के साथ नए सिरे से शुरू करता है। लेकिन अधिक संभावना है, यह स्ट्रोक अलग-अलग लंबाई की कई प्रविष्टियां शुरू करता है। इसलिए हम अगले स्ट्रोक को देखते हैं और देखते हैं कि क्या प्रविष्टियाँ हैं जो क्रम में उन दो स्ट्रोक से शुरू होती हैं; और इसी तरह जब तक हमें मैच नहीं मिलता।
तो ऊपर दिए गए शब्दकोश के साथ, मान लीजिए कि हमने यह क्रम देखा:
ACBBCABCABD
यहां बताया गया है कि हम इसका अनुवाद कैसे करेंगे:
A
अलग-अलग लंबाई की तीन प्रविष्टियों की शुरुआत है; अगले स्ट्रोक पर देखें:C
A/C
केवल एक प्रविष्टि से मेल खाता है; उत्पादन "एयर कंडीशनिंग" और अगले स्ट्रोक के साथ नए सिरे से शुरू करें:B
B
दो प्रविष्टियाँ शुरू करता है; अगले स्ट्रोक पर देखें:B
B/B
कुछ भी शुरू नहीं करता है; सबसे लंबा पिछला मैच लें ( B
) और आउटपुट ("मधुमक्खी")
- आउटपुट
B
= "मधुमक्खी" होने के बाद भी B
हमारे बफर में स्ट्रोक होता है। यह दो प्रविष्टियाँ शुरू करता है, इसलिए अगले स्ट्रोक को देखें:C
B/C
एक प्रविष्टि से मेल खाता है; आउटपुट "क्योंकि" और अगले स्ट्रोक के साथ नए सिरे से शुरू करें:A
A
तीन प्रविष्टियाँ शुरू करता है; अगला स्ट्रोक देखें:B
A/B
दो प्रविष्टियाँ शुरू करता है; अगला स्ट्रोक देखें:C
A/B/C
केवल एक प्रविष्टि से मेल खाता है; आउटपुट "अल्फाबेटिक" और अगले स्ट्रोक के साथ नए सिरे से शुरू करें:A
A
तीन प्रविष्टियाँ शुरू करता है; अगले स्ट्रोक पर देखें:B
A/B
दो प्रविष्टियाँ शुरू करता है; अगले स्ट्रोक पर देखें:D
A/B/D
कुछ भी मेल नहीं खाता है, इसलिए सबसे लंबे समय तक पिछले मैच ( A/B
) का उपयोग करें और इसे "वर्णमाला" आउटपुट के लिए उपयोग करें। वह हमें D
अभी भी बफर में छोड़ देता है ।
D
दो प्रविष्टियाँ शुरू करता है, इसलिए हम आम तौर पर अगले स्ट्रोक को देखेंगे - लेकिन हमने सभी स्ट्रोक संसाधित किए हैं, इसलिए इसे अलगाव में विचार करें। अलगाव में, यह "कुत्ते" के रूप में अनुवाद करता है ताकि उत्पादन हो।
नोट करने के लिए ऊपर के पहलू:
- आपके पास आपके द्वारा पढ़े गए स्ट्रोक का एक बफर है लेकिन अभी तक इसका अनुवाद नहीं किया गया है।
- आप हमेशा एकल प्रविष्टि के खिलाफ सबसे स्ट्रोक से मेल खाना चाहते हैं जो आप कर सकते हैं।
A/B
"वर्णमाला" के रूप में अनुवादित होना चाहिए, न कि "अल्फा" और "मधुमक्खी"।
- (ऊपर नहीं दिखाया गया है) आपके पास अच्छी तरह से स्ट्रोक के अनुक्रम हो सकते हैं जिन्हें आप अनुवाद नहीं कर सकते, क्योंकि वे शब्दकोश में कुछ भी मेल नहीं खाते हैं। (स्टेनो लोग संज्ञा "अनट्रांसलेट" का उपयोग करते हैं - उदाहरण के लिए, हमारे शब्दकोश के साथ, स्ट्रोक
E
एक "अनट्रेल" होगा।)
- (ऊपर नहीं दिखाया गया है) स्टेनो के कुछ सिद्धांत व्यापक संदर्भ के आधार पर, स्ट्रोक के एक ही सेट को एक से अधिक चीजों का मतलब देने की अनुमति देते हैं। स्टेनो लोग इन "संघर्षों" को कहते हैं। आप शायद उन्हें अपनी परियोजना में शामिल नहीं करना चाहते हैं, और वास्तव में जब स्टेनो को स्टेनोग्राफर द्वारा मैन्युअल रूप से अनुवादित किया जाता था, तो टकराव ठीक थे क्योंकि उन्हें पता होगा कि वाक्य में वे कहाँ से सही विकल्प थे, लेकिन वृद्धि के साथ मशीनी अनुवाद, स्टेनो के संघर्ष-मुक्त सिद्धांत विशेष रूप से परिणामस्वरूप अनुवादित पाठ और "फिक्स" संघर्षों से गुजरने से बचने के लिए उत्पन्न हुए।
- वास्तविक समय में अनुवाद करना (जो आप कर रहे हैं) का अर्थ है कि यदि आप आंशिक मैच प्राप्त करते हैं, तो आप अगले कॉर्ड का इंतजार करते हुए उस पर पकड़ बनाना चाहेंगे - लेकिन शायद केवल एक टाइमआउट तक, जिस बिंदु पर आप जो भी आपके पास बफर में है उसे आप सबसे अच्छा अनुवाद कर सकते हैं। (या हो सकता है कि आप टाइमआउट न चाहते हों; यह आपकी कॉल है।)
- शायद सबसे अच्छा है एक स्ट्रोक है जो कहता है "पिछले स्ट्रोक की उपेक्षा करें"
- शायद सबसे अच्छा है एक स्ट्रोक जो कहता है "कुछ भी आउटपुट के बिना पूरी तरह से बफर को साफ करें"