ฉันไม่ได้ทำโปรแกรม MIDI มาหลายปีแล้ว แต่ความคิดพื้นฐานของคุณนั้นยอดเยี่ยมมาก
MIDI เป็นกระแสของ "เหตุการณ์" (หรือ "ข้อความ") ซึ่งเป็นพื้นฐานที่สุดสองประการคือ "note on" และ "note off" ซึ่งมีหมายเลขบันทึก (0 = C ห้าอ็อกเทฟต่ำกว่ากลาง C ถึง 127 = G ห้าเลอะเลือนเหนือ G เหนือกลาง C ในครึ่งเสียง) เหตุการณ์เหล่านี้มีหมายเลข "velocity" บนคีย์บอร์ดที่ไวต่อความเร็ว ("touch sensitive") ด้วยแรง (คุณคาดเดา) ระหว่าง 0 ถึง 127
ระหว่างความเร็ว, chording และคันเหยียบฉันคิดว่าคุณน่าจะมีอินเตอร์เฟส "พิมพ์" ที่ดีสำหรับคีย์บอร์ดเปียโน โดยเฉพาะอย่างยิ่งการใช้ถ้อยคำอาจเป็นเทคนิคที่ทรงพลังมาก - ดังที่ฉันได้กล่าวถึงในความคิดเห็นนั่นเป็นเหตุผลว่าทำไมนักออกแบบเครื่องถ่ายภาพยศและไฟล์จึงสามารถใช้เครื่องสร้างภาพเคลื่อนไหวเพื่อให้ทันกับผู้คนที่พูดคุยกันหลายชั่วโมงติดต่อกัน ไม่สามารถใช้งานได้เป็นระยะเวลานานผ่านแป้นพิมพ์สไตล์เครื่องพิมพ์ดีดทั่วไป เช่นเดียวกับการจดชวเลขของเครื่องจักรคุณต้องมี "พจนานุกรม" ของความหมายของคอร์ดและลำดับของคอร์ด (คุณช่วยบอกได้ไหมว่าฉันเคยทำงานด้านซอฟต์แวร์ของการทำแผนที่เครื่องด้วยตนเอง?)
เมื่อต้องการทำเช่นนี้ชิ้นส่วนพื้นฐานคือ:
- รับอินพุต MIDI อย่าพยายามทำสิ่งนี้ด้วยตนเองใช้ห้องสมุด แก้ไข : เห็นได้ชัดว่า Java Sound API รองรับ MIDIรวมถึงการรับเหตุการณ์จากตัวควบคุม MIDI เย็น. หน้านี้อาจมีประโยชน์
- การแปลงข้อมูลนั้นเป็นการกดแป้นที่คุณต้องการส่งเช่นผ่านพจนานุกรมที่ฉันกล่าวถึงข้างต้น
- ส่งสัญญาณการกดแป้นพิมพ์ไปยังคอมพิวเตอร์
หากต้องการใช้งานร่วมกับซอฟต์แวร์ได้ในวงกว้างคุณต้องเขียนสิ่งนี้เป็นไดรเวอร์อุปกรณ์แป้นพิมพ์ นี่คือปลั๊กอินไปยังระบบปฏิบัติการที่ทำหน้าที่เป็นแหล่งสำหรับเหตุการณ์แป้นพิมพ์พูดคุยกับฮาร์ดแวร์พื้นฐาน (ในกรณีของคุณคือคีย์บอร์ดเปียโน) สำหรับ Windows และ Linux คุณอาจต้องการใช้ C สำหรับสิ่งนั้น
อย่างไรก็ตามเนื่องจากคุณเพิ่งสร้างการกดแป้นพิมพ์ (ไม่พยายามที่จะสกัดกั้นพวกเขาซึ่งฉันพยายามจะทำเมื่อหลายปีก่อน) คุณอาจใช้คุณลักษณะใด ๆ ที่ระบบปฏิบัติการมีเพื่อส่งการกดแป้น Windows มีอินเทอร์เฟซสำหรับการทำเช่นนั้น (อาจเป็นได้หลายอย่างที่ฉันคิดว่าเป็นSendInput
แต่ฉันรู้ว่ามีอินเทอร์เฟซ "เจอร์นัล" ที่ทำสิ่งที่คล้ายกัน) และฉันมั่นใจว่าระบบปฏิบัติการอื่น ๆ นั่นอาจเพียงพอสำหรับวัตถุประสงค์ของคุณ - มันเป็นจุดเริ่มต้นของฉันเพราะเส้นทางของไดรเวอร์อุปกรณ์จะไม่แน่นอนและคุณอาจต้องใช้ภาษาอื่นแทน Java (ฉันเป็นแฟนตัวยงของ Java แต่อินเทอร์เฟซที่ระบบปฏิบัติการใช้เพื่อพูดคุยกับไดรเวอร์อุปกรณ์มีแนวโน้มที่จะบริโภคได้ง่ายขึ้นผ่านทาง C และคล้ายกัน)
อัปเดต : เพิ่มเติมเกี่ยวกับ "พจนานุกรม" ของคอร์ดถึงการกดแป้น:
โดยพื้นฐานแล้วพจนานุกรมคือtrie (ขอบคุณ @Adam) ที่เราค้นหาด้วยการจับคู่คำนำหน้าที่ยาวที่สุด รายละเอียด:
ในการทำชวเลขชวเลขเครื่องชวเลขช่างเขียนเขียนโดยกดปุ่มหลายปุ่มบนเครื่องชวเลขรุ่นพร้อมกันจากนั้นปล่อยทั้งหมด พวกเขาเรียกสิ่งนี้ว่า "จังหวะ" ของคีย์บอร์ด มันเหมือนกับการเล่นคอร์ดบนเปียโน จังหวะบ่อยครั้ง (แต่ไม่เสมอไป) สอดคล้องกับพยางค์ของภาษาพูด เช่นเดียวกับพยางค์บางครั้งหนึ่งจังหวะ (คอร์ด) มีความหมายทั้งหมดด้วยตัวของมันเองบางครั้งหนึ่งจังหวะมีความหมายรวมกับจังหวะต่อไปนี้เท่านั้น (คิดว่า "ดี" กับ "ดี" ตามด้วย "บาย") แม้ว่าพวกเขาจะได้รับอิทธิพลอย่างมากจากโรงเรียนที่พวกเขาศึกษา แต่นักชวเลขแต่ละคนจะมี "พจนานุกรม" ของตัวเองว่าพวกเขาใช้จังหวะอะไรเพื่อหมายถึงอะไร พจนานุกรมจะมีรายการที่สั้นส่วน stenographic ("steno", สั้น ๆ ) เป็นหนึ่งจังหวะยาวหรือหลายจังหวะยาว บ่อยครั้งที่จะมีหลายรายการที่มีจังหวะเริ่มต้นเดียวกันซึ่งแตกต่างกันตามความยาวของพวกเขาและตามจังหวะที่ตามมา ตัวอย่างเช่น (และฉันจะไม่ใช้ steno จริงที่นี่เพียงแค่ตัวยึด) อาจมีรายการเหล่านี้:
A = alpha
A / B = ตัวอักษร
A / B / C = ตัวอักษร
เครื่องปรับอากาศ = เครื่องปรับอากาศ
B = ผึ้ง
B / C = เพราะ
C = ทะเล
D = สุนัข
D / D = Dee Dee
(ตัวอักษรเหล่านั้นไม่ได้หมายถึงโน้ตดนตรีเพียงแค่เครื่องหมายนามธรรม)
โปรดทราบว่าA
เริ่มต้นหลายรายการและทราบว่าวิธีการแปลลายC
เส้นขึ้นอยู่กับว่าคุณเคยเห็นA
, a B
, หรือคุณกำลังเริ่มต้นใหม่
โปรดทราบว่า (แม้ว่าจะไม่แสดงในตัวอย่างเล็ก ๆ ด้านบน) อาจมีหลายวิธีในการ "เล่น" คำหรือวลีเดียวกันแทนที่จะเป็นเพียงคำเดียว นักทำ Stenographers ทำเพื่อให้ง่ายต่อการไหลจากคำก่อนหน้าไปยังถัดไปขึ้นอยู่กับตำแหน่งมือ มีการเปรียบเทียบที่ชัดเจนเกี่ยวกับดนตรีที่นั่นและคุณสามารถใช้สิ่งนั้นเพื่อทำให้การพิมพ์ของคุณคล้ายกับการเล่นดนตรีมากขึ้นเพื่อป้องกันทั้งสองอย่างนี้ไม่ให้กระทบกับการเล่นเปียโนของคุณและเพื่อเพิ่มโอกาสในการช่วยเหลือ RSI
เมื่อแปล steno เป็นข้อความมาตรฐานเราจะใช้การค้นหา "การจับคู่คำนำหน้าที่ยาวที่สุด" อีกครั้ง: อัลกอริทึมการแปลเริ่มต้นด้วยจังหวะแรกที่เคยเขียนและค้นหารายการที่ขึ้นต้นด้วยจังหวะนั้น หากมีเพียงรายการเดียวและเป็นหนึ่งจังหวะยาวเราสามารถพูดได้อย่างน่าเชื่อถือว่า "นั่นคือรายการที่จะใช้" ออกข้อความที่สอดคล้องกันแล้วเริ่มต้นใหม่ด้วยจังหวะถัดไป แต่มีโอกาสมากขึ้นที่โรคหลอดเลือดสมองนั้นเริ่มต้นหลายรายการที่มีความยาวแตกต่างกัน ดังนั้นเราจะดูจังหวะต่อไปและดูว่ามีรายการที่เริ่มต้นด้วยสองจังหวะตามลำดับ; และต่อ ๆ ไปจนกว่าเราจะได้แมทช์
ดังนั้นด้วยพจนานุกรมด้านบนสมมติว่าเราเห็นลำดับนี้:
ACBBCABCABD
นี่คือวิธีที่เราต้องการแปล:
A
เป็นจุดเริ่มต้นของสามรายการที่มีความยาวต่างกัน ดูจังหวะต่อไป:C
A/C
ตรงกับหนึ่งรายการเท่านั้น เอาท์พุท "เครื่องปรับอากาศ" และเริ่มต้นใหม่ด้วยจังหวะถัดไป:B
B
เริ่มสองรายการ; ดูจังหวะต่อไป:B
B/B
ไม่ได้เริ่มอะไรเลย ใช้การแข่งขันก่อนหน้าที่ยาวที่สุด ( B
) และเอาท์พุทที่ ("ผึ้ง")
- มี output
B
= "bee" เรายังคงมี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
ควรแปลเป็น "ตัวอักษร" ไม่ใช่ "alpha" และ "bee"
- (ไม่แสดงด้านบน) คุณอาจมีลำดับการสโตรกที่คุณไม่สามารถแปลได้เพราะพวกเขาไม่ตรงกับสิ่งใดในพจนานุกรม (คน Steno ใช้คำนาม "untranslate" - เช่นด้วยพจนานุกรมของเราจังหวะ
E
จะเป็น "untranslate")
- (ไม่แสดงด้านบน) ทฤษฎีสเตโนบางทฤษฎีอนุญาตให้สโตรกชุดเดียวกันมีความหมายมากกว่าหนึ่งอย่างขึ้นอยู่กับบริบทที่กว้างขึ้น คน Steno เรียก "ความขัดแย้ง" เหล่านี้ คุณอาจต้องการที่จะไม่อนุญาตให้พวกเขาในโครงการของคุณและในความเป็นจริงเมื่อ steno เคยถูกแปลด้วยตนเองโดยนักชวเลขนักเขียนความขัดแย้งได้ดีเพราะพวกเขารู้เพียงแค่ว่าประโยคไหนเป็นตัวเลือกที่ถูกต้อง การแปลด้วยคอมพิวเตอร์ทฤษฎีที่ปราศจากความขัดแย้งของสเตโนเกิดขึ้นโดยเฉพาะเพื่อหลีกเลี่ยงการแปลข้อความที่เกิดขึ้นและ "แก้ไข" ความขัดแย้ง
- การแปลแบบเรียลไทม์ (ซึ่งคุณกำลังทำอยู่) หมายความว่าหากคุณได้รับการจับคู่บางส่วนคุณจะต้องหยุดไว้ขณะรอคอร์ดถัดไป - แต่อาจจะหมดเวลาสูงสุดเท่านั้น แปลสิ่งที่คุณมีในบัฟเฟอร์ให้ดีที่สุด (หรือบางทีคุณอาจไม่ต้องการหมดเวลาเพราะเป็นสายของคุณ)
- อาจดีที่สุดที่จะมีจังหวะที่ระบุว่า "ไม่สนใจจังหวะก่อนหน้า"
- อาจดีที่สุดที่จะมีจังหวะที่ระบุว่า "ล้างบัฟเฟอร์อย่างสมบูรณ์โดยไม่ต้องแสดงผลอะไร"