피아노 키보드를 컴퓨터 키보드로 사용 [닫기]


727

나는 RSI 문제가 있고 30 개의 다른 컴퓨터 키보드를 사용해 보았는데 모두 고통을 겪었다. 피아노를 연주해도 통증이 없습니다. 나는 통증 문제없이 약 20 년 동안 피아노를 연주했습니다. MIDI 키보드에서 MIDI를 캡처하고 키보드 스트로크를 출력하는 방법이 있는지 알고 싶습니다. MIDI에 대해서는 전혀 알지 못하지만이 신호를 키 입력으로 변환하는 방법에 대한 지침을 원합니다.


신디사이저 키보드를 키보드로 사용할 수 있다면 왜 midi를 캡처해야합니까?
shevski

@I__ : 어떤 운영 체제를 지원해야합니까? 아마 중요 할 것입니다.
TJ Crowder

5
@shevski : 나는 아무것도하려고하지 않습니다. @ I__는 질문하는 사람입니다. 소리 를 변환하는 것이 아니라 악기 디지털 인터페이스 를 통해 전자 키보드로 전송되는 디지털 키보드 이벤트 신호 입니다. 이것들은 컴퓨터 키보드 이벤트와 매우 유사합니다 : "Note on"은 keydown, "note off"는 keyup 등에 잘 맞습니다. 벨로 시티 데이터를 사용하여 코드가 얼마나 "큰 소리로"연주되었는지에 따라 다른 동작을 수행 할 수도 있습니다. 나는 그 아이디어를 좋아한다.
TJ Crowder

34
이 기능을 사용하려면 모든 종류의 미디 장치를 사용하여 코딩 할 수 있습니다. 연습이 필요할지 모르지만 오케스트라를 개발 팀으로 사용하는 것은 재미 있어야합니다.
Toon Krijthe

1
@I__ : 가장 많이 대답 한 답변 은 Java 사운드 API의 MIDI 지원을 알려주며 , MIDI 데이터를 수신해야하며 일련의 키 스트로크로 변환하는 데 관련된 이론을 자세하게 설명합니다. 두 번째로 많이 찬란한 답변 은 다음과 같은 Arduino를 사용하여 컴퓨터에 연결할 수있는 매우 실용적인 방법에 대해 이야기합니다. (계속)
TJ Crowder

답변:



430

몇 년 동안 MIDI 프로그래밍을 해 본 적이 없지만 기본 아이디어는 매우 건전합니다 (말장난 없음).

MIDI는 "이벤트"(또는 "메시지")의 스트림이며, 가장 기본적인 두 가지는 "노트 온"과 "노트 오프"입니다. 노트 번호 (0 = C 중간 C 아래 5 옥타브, 127 = G 중간 옥타브 위의 G보다 5 옥타브 (반음 단위). 이 이벤트는 속도에 민감한 ( "터치 감지") 키보드에서 "속도"숫자를 전달하며 0과 127 사이의 힘을가집니다.

벨로 시티, 코드, 페달 사이에서 피아노 키보드를위한 "타이핑"인터페이스를 만들 수 있다고 생각합니다. 주석에서 언급했듯이 특히 화음은 매우 강력한 기술이 될 수 있습니다. 왜냐하면 랭크 앤 파일 스테 노 그래프는 스테 노 타입 기계 를 사용하여 사람들이 여러 시간 동안 연속적으로 이야기하는 사람들과 계속해서 대화 할 수 있습니다. 일반 타자기 스타일의 키보드를 통해 어떤 시간에도 사용할 수 없습니다. 기계 음반 법과 마찬가지로 코드 및 코드 시퀀스의 의미에 대한 "사전"이 필요합니다. (기계 음반의 소프트웨어 측에서 일 했었다고 말할 수 있습니까?)

이를 위해 기본적인 부분은 다음과 같습니다.

  • MIDI 입력 수신 이 작업을 직접 수행하지 말고 라이브러리를 사용하십시오. 편집 : 분명히 Java Sound API MIDI 컨트롤러에서 이벤트 수신을 포함하여 MIDI를 지원합니다 . 멋있는. 이 페이지 도 유용 할 수 있습니다.
  • 예를 들어 위에서 언급 한 사전을 통해 해당 데이터를 보내려는 키 스트로크로 변환합니다.
  • 키 스트로크를 컴퓨터로 출력.

소프트웨어와 가장 광범위하게 호환 되려면 키보드 장치 드라이버로 작성해야합니다. 기본 하드웨어 (귀하의 경우 피아노 키보드)와 통신하여 키보드 이벤트의 소스 역할을하는 운영 체제의 플러그인입니다. Windows 및 Linux의 경우 아마도 C를 사용하고 싶을 것입니다.

그러나 키 스트로크를 생성 하고 있기 때문에 (수년 전에 시도했던 키 스트로크를 가로 채지 않으려는 경우) 인공 키 스트로크를 보내기 위해 운영 체제의 모든 기능을 사용할 수 있습니다. Windows에는 그렇게하기위한 인터페이스가 있습니다 (아마도 몇 가지 생각합니다. SendInput하지만 비슷한 것을하는 "저널"인터페이스가 있음을 알고 있습니다). 다른 운영 체제도 마찬가지입니다. 장치 드라이버 경로가 어색하고 Java와 다른 언어를 사용해야하기 때문에 시작하기에 충분할 것입니다. (저는 Java의 열렬한 팬이지만 운영 체제가 장치 드라이버와 통신하는 데 사용하는 인터페이스는 C를 통해보다 쉽게 ​​소비되는 경향이 있습니다.)


업데이트 : 키 스트로크에 대한 코드의 "사전"에 대한 추가 정보 :

기본적으로 사전은 가장 긴 접두사로 검색 하는 trie (감사, @Adam)입니다. 세부:

기계 협착에서, stenographer는 stenotype 기계에서 여러 키를 동시에 누른 다음 모두 해제하여 기록합니다. 그들은 이것을 키보드의 "스트로크"라고 부릅니다. 피아노에서 코드를 연주하는 것과 같습니다. 항상 (항상 그런 것은 아님) 스트로크는 음절의 음절에 해당합니다. 음절과 마찬가지로 한 번의 스트로크 (코드)는 자체적으로 모든 의미를 갖지만 다른 경우에는 다음 스트로크와 결합 된 의미 만 있습니다. ( "good"과 "good", "bye")를 생각하십시오. 비록 그들이 공부 한 학교의 영향을 많이받을 것이지만, 각 안무가들은 그들이 무엇을 의미하는지에 대한 자신의 "사전"을 가지고있을 것입니다. 사전에는 협착 부분 (짧은 경우 "steno")이 1 행 길이이거나 여러 스트로크 길이 인 항목이 있습니다. 종종 시작 스트로크가 동일한 여러 항목이 길이와 후속 스트로크로 구분됩니다. 예를 들어 (여기서는 실제 steno를 사용하지 않고 자리 표시 자만 사용) 다음 항목이있을 수 있습니다.

A = 알파
A / B = 알파벳
A / B / C = 알파벳
A / C = 에어컨
B = 꿀벌
B / C = 때문에
C = 바다
D = 개
D / D = 디디

(이러한 글자는 음표가 아니라 추상 마커 일뿐입니다.)

A여러 항목 을 시작하고 C획 을 변환하는 방법 은 이전에 A,을 보았는지 B또는 새로 시작 했는지에 따라 다릅니다 .

또한 (위의 아주 작은 샘플에는 표시되지 않았음에도 불구하고) 하나 이상의 단어 나 문구가 아닌 "단어"를 재생하는 여러 가지 방법이있을 수 있습니다. Stenographers는 손의 위치에 따라 이전 단어에서 다음 단어로 쉽게 넘어갈 수 있도록합니다. 거기에는 음악과 명백한 비유가 있으며, 피아노 연주에 부정적인 영향을 미치는 것을 방지하고 실제로 RSI에 도움이 될 가능성을 극대화하기 위해 음악을 연주하는 것과 유사한 타이핑 흐름을 만들 수 있습니다.

steno를 표준 텍스트로 번역 할 때, 우리는 다시 "가장 긴 접두사 일치"검색을 사용합니다. 번역 알고리즘은 처음 작성된 첫 번째 스트로크로 시작하여 해당 스트로크로 시작하는 항목을 찾습니다. 항목이 하나만 있고 길이가 한 스트로크이면 "사용할 항목"이라고 확실하게 말하고 해당 텍스트를 출력 한 후 다음 스트로크로 새로 시작할 수 있습니다. 그러나 그 스트로크는 다양한 길이의 여러 항목을 시작합니다. 다음 스트로크를보고 순서대로이 두 스트로크로 시작하는 항목이 있는지 확인합니다. 일치 할 때까지 계속합니다.

위의 사전에서 다음 순서를 보았습니다.

ACBBCABCABD

번역 방법은 다음과 같습니다.

  1. A다양한 길이의 세 항목의 시작입니다. 다음 스트로크를 보라.C
  2. A/C하나의 항목 만 일치합니다. "에어컨"을 출력하고 다음 스트로크로 새로 시작하십시오.B
  3. B두 항목을 시작합니다. 다음 스트로크를 보라.B
  4. B/B아무것도 시작하지 않습니다. 가장 긴 이전 일치 ( B)를 가져 와서 그 결과 ( "bee")
  5. output B= "bee"인 경우에도 B버퍼에 스트로크가 있습니다. 두 항목을 시작하므로 다음 스트로크를 살펴보십시오.C
  6. B/C하나의 항목과 일치합니다. "왜냐하면"출력하고 다음 스트로크로 새로 시작하십시오.A
  7. A세 항목을 시작합니다. 다음 스트로크를 보라.B
  8. A/B두 항목을 시작합니다. 다음 스트로크를 보라.C
  9. A/B/C하나의 항목 만 일치합니다. "알파벳"을 출력하고 다음 스트로크로 새로 시작하십시오.A
  10. A세 항목을 시작합니다. 다음 스트로크를 보라.B
  11. A/B두 항목을 시작합니다. 다음 스트로크를 보라.D
  12. A/B/D일치하는 것이 없으므로 가장 긴 이전 일치 ( A/B)를 사용하여 "알파벳"을 출력하십시오. 그 잎 우리를 D여전히 버퍼이다.
  13. D두 개의 항목을 시작하므로 일반적으로 다음 스트로크를 살펴볼 것입니다. 그러나 모든 스트로크를 처리 했으므로이를 개별적으로 고려하십시오. 격리 된 상태에서 "dog"으로 변환되므로 출력합니다.

위의 사항에 유의하십시오.

  • 읽었지만 아직 번역하지 않은 스트로크 버퍼가 있습니다.
  • 당신은 항상 당신이 할 수있는 하나의 항목에 대해 가장 많은 스트로크를 일치 시키려고합니다. A/B"알파"와 "꿀벌"이 아닌 "알파벳"으로 번역되어야합니다.
  • (위에 표시되지 않음) 사전에있는 것과 일치하지 않으므로 번역 할 수없는 일련의 획이있을 수 있습니다. (Steno 사람들은 "untranslate"라는 명사를 사용합니다. 예를 들어 사전에서는 획 E이 "untranslate"입니다.
  • (위에 표시되지 않음) 일부 steno 이론은 더 넓은 상황에 따라 동일한 스트로크 세트가 둘 이상의 것을 의미 할 수 있습니다. Steno 사람들은 이것을 "충돌"이라고 부릅니다. 당신은 아마 당신의 프로젝트에서 그것들을 금지하고 싶을 것입니다. 그리고 실제로 stenographer가 steno를 수동으로 번역 할 때, 문장의 어느 부분이 올바른 선택인지 알았 기 때문에 갈등은 좋았습니다. 번역 된 텍스트와 "수정"충돌을 피하기 위해 기계 번역, 스테 노의 충돌없는 이론이 생겨났습니다.
  • 실시간으로 번역한다는 것은 부분적으로 일치하는 부분을 받으면 다음 코드를 기다리는 동안이를 유지하고 싶지만, 아마도 타임 아웃까지만 가능하다는 의미입니다. 버퍼에있는 내용을 최대한 번역하십시오. (또는 시간 초과를 원하지 않을 수도 있습니다. 전화입니다.)
  • "이전 스트로크 무시"라고 말하는 스트로크를 사용하는 것이 가장 좋습니다.
  • 아마도 "아무것도 출력하지 않고 버퍼를 완전히 지우십시오"라는 스트로크를 갖는 것이 가장 좋습니다.

6
@I__ : 일부 프로그램은 키보드 장치와 직접 대화하려고하므로 "센드 키"와 같은 인터페이스로 멋지게 재생되지 않습니다. 바라건대 이것은 내가 이것을 마지막으로 다룰 때 몇 년 전보다 지금은 덜 일반적이며, 내가 말했듯이, 나는 메커니즘과 같은 "Sendkeys"로 시작하고 필요할 때 다른 것에 대해서만 걱정할 것입니다. (특별 키 시퀀스를 포함하여 키를 직접 전송하지 않고 자체적으로 키를 전송하여 테스트하는 빠른 프로그램을 테스트 한 다음 경로를 너무 멀리 가기 전에 제어하려는 소프트웨어로 테스트하는 것이 가장 좋습니다. .)
TJ Crowder

7
이 말을 들어 본 적이없는 사람들을 위해, 당신이 묘사하는 사전은 기본적으로 Trie ( '시도'로 발음 됨)
Adam

14
@I__ : 지금 말하기에 흥미 롭습니다 . 무엇을 더 원하십니까? 나는 당신이해야 할 일의 많은 중요한 측면을 다루었다고 생각합니다. 내가하지 않은 내가 할 수있는 다른 일이 있고 사전 구축 된 솔루션의 알 발생하지 않기 때문에, 그것을, 나이 사람을 지적했다. 그러나 솔루션 구축 측면 에서 올바른 방향으로 당신을 지적했다고 생각합니다.
TJ Crowder

2
미디 이벤트를 수신 할 때마다 모든 코드를 선형 배열로 걸러 내고 순회 할 수 있지만 여전히 눈에 띄는 속도 저하가 발생하지 않습니다. trie를 사용하면 약간의 조기 최적화 냄새가납니다.
FeepingCreature 2019 년

5
@FeepingCreature : 스테 노 그래프와 법정 리포터들과 함께이 일을했을 때, 그들의 사전은 수십만 항목에 달할 수있었습니다 (백만 명을 돌파 한 사람을 기억합니다). 최적화 전략을 사용하는 것에 대한 원격 조기 조치는 없었으며 12MHz 386을 처리했습니다. I___의 경우, 그가 Arduino 아이디어 (정말 멋진 아이디어)를 사용한다면, 그는 현대 시대에 상당히 저전력 하드웨어를 처리 할 것입니다. 물론 우리가 가지고있는 것보다 엄청나게 빠릅니다. 나는 ... 그의 사전 극적으로 작아지는 경향이 있다고 생각하지만
TJ 크라우

184

USB (또는 PS / 2?) 키보드를 에뮬레이트하는 하드웨어에서 무언가를하는 것을 고려하십시오. 더 이상 특정 OS 또는 특정 OS API에 의존하지 않습니다. 하드웨어 솔루션은 시간의 시험을 견뎌 낼 것입니다. 다른 사람이 Windows 11을 실행하는 경우 Windows 7에서 이전 API를 사용하지 마십시오! Arduino 는 배우기 매우 쉽습니다.

Arduino에 대한 많은 정보가 있으며 도움이됩니다. 초보자를 위해 구축 된 하드웨어 해킹 플랫폼입니다. 구글이 아두 이노를 추진함에 따라 이제는 더 커질 것이다 .

편집 : 가상 USB 키보드 소프트웨어하드웨어


나는 이것을 위해 Arduino를 사용한다는 아이디어를 좋아합니다. 그래도 메모리는 문제가 될 수 있습니다. 사전 설계된 최대 보드에는 256k 플래시 (부트 로더에서 8k 사용)가있는 것 같습니다. 당시에는 DOS에서 기계 속기의 실시간 번역 / 디스플레이 / 편집을 1M로 (예 : 일반적인 640k + EMS 또는 확장 메모리) 작성했지만, C 코드와 어셈블리 및 사전을 작성했습니다. 자체적으로> 250k 이상이어야 함) 디스크에있었습니다. 여기에는 디스플레이 나 동시 편집이 없기 때문에 훌륭하지만 사전은 작아야합니다.
TJ Crowder

아, 그건 아무것도 아니야 나는 우리가 사용한 아주 컴팩트 한 형태로 저장 되어도 몇 메가 바이트 크기의 사전을 가진 법원 기자들을 정기적으로 다루었습니다. 내가 개인적으로 본 것 중 가장 큰 것은 4.5MB였으며 다시 압축 된 형태로 저장되었습니다. 이것을 피아노 키보드보다 스테 노 키보드에 적은 키가 있다는 사실과 결합하십시오 ... 그러나 Arduino에는 USB 포트가 있으므로 사전은 USB 플래시 어댑터 또는 외부 전원 공급 장치에있을 수 있습니다 ) SSD 또는 HDD.
TJ Crowder

2
@ arduino ( pjrc.com/teensy ) 대신 상당히 많은 메모리를 사용하여 키보드를 직접 에뮬레이트 할 수 있습니다. 이미 많은 arduino 라이브러리와 호환되며 호환되지 않는 라이브러리는 핀 재 할당이 필요합니다. -또는 대안으로 atmega는 16MB의 내장 플래시와 약 30 달러 (at90usbkey)의 데모 보드를 만듭니다
Marc

8
컴퓨터에 유용한 피아노 인터페이스를 설계하는 것은 쉬운 일이 아닙니다. OPHO는 OP가 먼저 현재 환경에서 프로토 타입을 프로토 타입 한 다음 자신의 요구를 충족하면 이식성에 대해 걱정해야합니다. 물론, 휴대용 대안이 눈에 띄게 어렵지 않다면.
Emilio M Bumachar

111

직접 빌드하는 방법에 대한 조언을 덜 찾고 있고 원하는 것을 달성하기 위해 이미 어떤 리소스가 있는지 묻고있는 것처럼 들립니다. OS에 따라 처음부터 자체 프로그램을 작성하지 않고도 여러 가지 방법으로이를 수행 할 수 있습니다.

미디 스트로크

비어 있는. 들어 맥 OS X 10.3까지 . 이것은 특히 "모든 MIDI 키보드를 컴퓨터 키보드로 완전히 사용할 수있는 기능"과 함께 제공됩니다 .

Bome의 MIDI 번역기

Free / Postcardware (조금 이상하다). 내용은 Windows 2000 및 최대 및 Mac OS X . 처음에는 AutoHotkey 유형 사용법에 더 적합하게 보이지만 더 자세히 살펴보면 원하는 것을 잘 수행 할 수 있다고 생각합니다.

최대 및 일명 키보드

비어 있는. 들어 맥 OS X . "즉시 사용 가능한"솔루션은 아니지만 기본 장치 구성에 익숙하다면 그렇게 나쁘지 않아야합니다.


49

MIDI DotNet의 .NET에서 소스 코드 샘플을 사용하여 하드웨어에 액세스 할 수 있습니다 .

MIDI 노트 데이터 스트림을 생성하기위한 소스 코드로서의 완전한 작업 샘플은 VB 5 / 6-Tipp 0521에 있습니다 : MIDI-Töne erzeugen (Visual Basic 6.0, 어딘가에 .NET 버전)

키보드 스트로크를 시뮬레이트하는 방법은 VB 5 / 6-Tipp 0155 : Tastaturereignisse simulieren (Visual Basic 6.0, .NET 버전도 있음)에 있습니다.

키 입력 인식은 Tipp-Upload : VB.NET 0266 : Globaler KeyHook에 설명되어 있습니다.

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

그런 다음 피아노 연주자에게 좋은 작동 매트릭스를 사용하십시오. 티모 보이 메 www.goldengel.ch

피아노와 좋은 연주자 일 때는 키보드에 10 개의 손가락을 사용할 수 있으며 매트릭스를 사용할 수 있다면 내가 생각하는 컴퓨터 키보드 사용자보다 훨씬 빠를 수 있습니다. :-)

이 경우, 귀하의 질문을 올바르게 이해하면 큰 일이 아닙니다.


41

대학에서 피아노 연주를 공부 한 다음 상호 작용 디자인, 프로그래밍 및 Vim 사용에 대해 배웠 으므로 실제로 이와 같은 것을 프로토 타이핑하는 데 많은 시간을 보냈습니다.

멀티미디어 아티스트 " Pure Data "의 그래픽 프로그래밍 언어 와 Alex Andre의 외부 x11key 를 사용하여 Linux에서이 작업을 매우 빠르게 수행 할 수 있습니다 .

Mac에서는 MidiStroke 를 사용할 수 있습니다 . Windows의 방법에는 MidiOxAutoHotKey 도구가 포함되어 있다고 생각합니다 . 다른 시간에 Max / MSP 용 Java 플러그인을 사용하는 버전이있었습니다 . Patrice Colet 이 Pure Data 외부의 창을 만든 것으로 생각 하지만 더 이상 찾을 수없는 것 같습니다. 또한 Windows에서이를 수행 할 수있는 MaxMSP 용 외부 가 있습니다. 마지막으로, 무료이지만 멋진 Osculator 는 원하는 기능을 수행 할 수 있습니다. 기능 페이지를 참조하십시오.

그것이 작동했을 때, 나는 레이아웃으로 툴링을 멈출 수 없었기 때문에 결코 붙어 있지 않았습니다. 그래도 모니터를 전기 키보드에 두는 것이 멋졌습니다! 행운을 빕니다.


37

MIDI에 대하여

당신은 "MIDI에 대해 전혀 모른다"고 말했습니다. MIDI 기술은 일단 이해하면 매우 간단하지만 처음에는 혼동 될 수 있습니다. MIDI의 기초를 이해하는 데 큰 도움이 된 자료 중 하나 (MIDI 상호 작용을 프로그래밍하려는 경우 확실히 필요함) 는 Technophobe를위한 MIDI 라는 책 입니다. 읽기 쉬운 책이며 매우 유용합니다.


순수한 데이터 및 최대

대화 형 멀티미디어를 개발 한 경험에 따르면 어느 장치에서나 신호 / 입력을 연결하고 매핑하는 데 도움이되는 매우 유사한 두 가지 프로그램이 있습니다.

Mac 환경의 경우 Max 이고 PC 환경의 경우 Pure Data 입니다. 둘 다 온라인 설명서와 YouTube 자습서가 많이 있습니다. 비디오 Max / MSP Tutorial 1-컴퓨터 키보드를 midikeyboard (ableton 스타일)로 사용하여 Max에 내장 된 프로그램을 통해 컴퓨터 키보드를 MIDI 키보드 입력 (기본적으로 수행하려는 작업과 정반대 임)에 매핑합니다. 동일한 패턴을 사용하지만 신호 / 매핑을 반대로하여 원하는 결과를 얻을 수 있습니다.


오토 핫키

AutoHotKey 는 장치의 키와 버튼을 매크로에 다시 매핑 할 수있는 Windows 용 무료 오픈 소스 유틸리티입니다. QWERTY 키보드, 조이스틱 및 마우스 매크로를 기본적으로 지원합니다.

그러나 찾고있는 특정 매핑을 지원하는 구현을 찾을 수있었습니다. 이 두 스레드는 프로세스를 설명합니다.

  1. 사용 사례에 대한 논의 인 AutoHotkey의 MIDI IN 지원 . 저자는 MIDI IN 입력을 감지하고이를 키 누르기로 변환 할 수 있는 프로그램을 찾고 있었습니다 .

  2. MIDI 입력 라이브러리 , 저자의 문제에 대한 솔루션 및 실제로 의도 한 결과를 구현하는 AutoHotKey에 게시 된 코드 / 패치.

기본적으로 AutoHotKey는이 사용자의 사용자 지정 패치와 함께 MIDI 키보드에서 QWERTY 키보드의 입력 신호로 매핑하는 데 필요한 것을 정확하게 제공합니다. 매핑을 설치, 구성 및 정의하기 만하면됩니다.


다른 거있어?

다른 답변 중 일부는 일반적으로 MIDI 및 MIDI 프로그래밍에 대해 훨씬 더 광범위한 정보를 제공했지만 게시물 상태로는 원하는 것이 아닌 것 같습니다. 가능하면 더 많은 도움을 드리고 싶지만 찾고있는 정보 유형에 대해 더 구체적으로 설명하면 더 쉬울 것입니다. 예를 들어, MIDI 키보드의 입력 신호를 QWERTY 키보드의 신호 로 변환하는 방법에 더 관심이 있습니까 , 아니면 특정 문제 에 대한 기본 솔루션찾는 데 관심이 있습니까? 아직 해결되지 않은 것은 무엇입니까?


27

Teenys 마이크로 컨트롤러를 사용하여 자신의 USB 키보드를 매우 빠르게 해킹 할 수 있습니다.

실제로 USB 키보드만드는 방법에 대한 예제 코드가 있습니다 .

이 두 가지 방법으로 접근 할 수 있습니다.

  1. 오래된 피아노를 가져와 스위치를 십대에 직접 연결하십시오.

  2. 추가 논리를 추가하여 MIDI 포트 및 필요한 디코딩에 연결하십시오.


장치를 완성하면 모든 컴퓨터와 모든 OS에서 작동하기 때문에 이것은 가장 유망한 답변입니다. 키보드를 걱정하지 않고 컴퓨터를 업그레이드 할 수 있다는 사실에 만족하십시오. Teensy 장치 두 개를 사용하여 I / O 핀과 함께 연결합니다. Teensy는 이미 USB MIDI pjrc.com/teensy/td_midi.html을 지원하므로 코드는 키보드 teensy와 midi teensy 사이의 신호 이동을 처리하면됩니다.
Michael Dillon

24

실제로, 나는 얼마 전에이 작업을 수행하여 Rock Band 드럼 입력을 내 컴퓨터로 캡처하려고 시도했습니다 (약간의 Java 수제 드럼 에뮬레이터 만들기) 어쨌든 여기에 대해 질문했습니다. 시간 지연 문제 (폴링 코드가 있습니다) , 내가 시도한 것과 함께.). 그리고 내 프로그램을 찾을 수 있으면 코드를 줄 수 있으며 타사 API ( JInput )를 사용합니다.

어느 쪽이든 행운을 빈다.


23

Bome의 MIDI 번역기를 사용해보십시오 .

그것은 크로스 플랫폼에서 작동하며, 모든 MIDI 입력을 쉽게 키 스토크 로 변환하고 , 설정 및 구성이 빠르며, 개인 용도로 무료입니다.

쉽게 설정하는 방법에 대한 튜토리얼 인 빠른 팁 : MIDI 번역 – MIDI에서 키 스트로크 까지의 튜토리얼 이 있습니다.

기본적으로 코드 및 수정 자 키를 포함하여 수행 할 수있는 작업의 무한한 가능성이 있습니다. 라이브 오디오 장비에서 피아노를 사용하여 DAW 를 제어하는 ​​데 사용하며 문제가 없었습니다.


18

Java에서는 JMF (Java Media framework)를 사용하여 MIDI 신호를 변환 할 수 있습니다. 키보드 디자인의 기본은 사용하기 쉽고, 즉 사용자 인터페이스입니다. 자주 사용하는 문자 / 기호를 편리하게 배치하십시오.

Java 사운드 자원 의 샘플 코드 및 API : 예 : DSP (Digital Signal Processing)는 신호 처리 방법을 이해하는 데 도움이됩니다.

더 많은 참고 문헌 :


15

GlovePIE 라는 프로그램이 있습니다 . 간단한 스크립팅 언어로 프로그래밍 할 수 있으며 MIDI를 지원한다고 생각합니다. 이것이 "자바"카테고리에 해당되는지 확실하지 않지만 여전히 훌륭한 프로그램입니다. PS3 컨트롤러를 사용하여 로봇을 제어하는 ​​데 사용했습니다 . 매우 강력합니다.


15

많은 키보드에는 컴퓨터로 MIDI 신호를 보내기 위한 직렬 포트 ( RS-232 ) 커넥터가 있습니다. 직렬 포트 통신을 키보드 스트로크로 변환하기 위해 거더 라는 프로그램을 사용합니다 .

대들보에는 "매핑"기능이있어 각 키를 하나씩 해당 키 스트로크에 매핑 할 수 있습니다.

이것은 당신이 찾고있는 간단한 해결책 일 수 있습니다!


12

stenography를 배우십시오!

귀하의 모든 토론에서 분명합니다. 기술적 인 관점에서 휠을 다시 발명하고 싶지 않습니다. 그러나 일단 당신이 연결되고 (이 질문이 요구하는) 일을하고 일을하더라도 여전히 대부분의 일을 할 수 있습니다 : 당신은 두뇌를 훈련시켜야합니다. 당신은 또한 디자인 문제를 완전히 밖으로 컴퓨터 기술 전문가의 rhealm의 - 그렇게 할 수있는 영리한, 가장 효율적인 방법을 발명해야합니다. 당신이나 우리 중 누구라도 부족할 것입니다.

운 좋게도,이 문제는 수세기에 걸쳐 해결되었지만 해결되었습니다 ...

stenography를 배우십시오!

예, 이렇게하면 잭이 다시 설정됩니다. 그러나 결국 수백 시간의 가치가 있으며 결국 덜 유리한 결과는 무엇입니까? 또한, stenography Wikipedia 기사 는 '피아노 키보드처럼 보입니다'라고 말합니다.

물론, 사이드 쇼 효과를 원치 않는 한. 나는이 가능성에 대해 결코 생각하지 않았다는 것을 인정해야 할 것입니다. 누군가 피아노 키보드에서 텍스트를 버리는 것을 보는 것은 정말 재미 있을 것입니다 !

터치 패드 가있는 USB 키보드로 시작 하거나 포인팅 스틱 이 더 인체 공학적 일 수 있습니까? Plover 를 사용 하여 번역하십시오. 프로그래밍) 또는 스레드 Re : Plover 키보드 를 따라 자신의 USB stenography 키보드를 굴 리거나 stenotype을 구입 하십시오 .

행운을 빕니다!


stenography 키보드의 {및}는 어디에 있습니까? 단어가 아닌 이름을 어떻게 입력 pthread하시겠습니까?
bobobobo

위키 백과 링크가 잘못되어 en.wikipedia.org/wiki/Stenography
joelhoro

11

MAME 아케이드 게임을 살펴보십시오 . 그들은 다양한 품목으로부터의 입력을 허용하는 하드웨어 장치를 구축했습니다. IPAC는 , 예를 들면, USB 장치에 입력으로 변환 신호는 컴퓨터는 에뮬레이트 키를 사용할 수있다. 입력 해석을위한 소프트웨어가 이미 수행되고 테스트 되었기 때문에 미친 프로그래밍 논리가 필요없는 편안한 방식으로 입력 장치 조합을 사용할 수 있습니다.

이 방법으로 제작 된 비행 시뮬레이터 조종석 입력, 맞춤형 키오스크 및 투표 시스템을 보았습니다.


10

이 문제를 해결하려면 몇 가지가 필요합니다.

  1. 키보드에서 MIDI 데이터를 캡처하는 방법. 인터페이스에 따라 : MIDI 인터페이스 (클래식) 또는 USB MIDI 인터페이스 (현대)는 가장 많은 옵션을 제공하므로 컴퓨터에 대한 인터페이스입니다. USB 호스트 마이크로 컨트롤러는 컴퓨터를 사용하는 것만 큼 간단하지 않습니다.

  2. MIDI 데이터를 키 스트로크로 변환하는 체계. 한 명의 사용자가 지적한 것처럼 건반의 수는 피아노 건반의 수에 의존하지 않기 때문에 갈 길입니다.

  3. 운영 체제에 키를 삽입하는 방법. 이를 위해서는 정확한 저수준 드라이버가 필요합니다. 키보드 및 마우스 데이터를 Windows 7의 응용 프로그램에 삽입하는 응용 프로그램을 가지고 놀았으며, 응용 프로그램이 현재 초점이 맞는지에 따라 색다른 것이 될 수 있습니다. 인터페이스의 가장 어려운 부분입니다. 작동 하는 것은 직렬 인터페이스가있는 HID USB 키보드 마이크로 컨트롤러 를 만드는 것 입니다.

직렬 인터페이스는 가상 직렬 포트를 만듭니다. MIDI 데이터를 읽고 키 입력을 생성하는 소프트웨어는 가상 직렬 포트로 직렬 메시지를 보낼 수 있습니다. 마이크로 컨트롤러는 키 입력을 보내 표준 키보드 입력처럼 보입니다. 이렇게하면 MIDI 포트와 USB MIDI 키보드를 모두 인터페이스 할 수 있습니다.

흠,이 유형의 인터페이스를 사용하면 마우스를 시뮬레이션하고 마우스 축과 버튼에 대한 피아노 키 설정을 사용할 수도 있습니다. 압력은 마우스 포인터 속도를 결정하는 데 사용될 수 있습니다. 따라서 마우스도 제거 할 수 있습니다. 이 방법의 또 다른 이점은 연결하는 모든 유형의 입력 장치가 가상 직렬 포트와 통신하여 키보드 및 마우스 이벤트를 생성 할 수 있다는 것입니다. 따라서 드럼 페달이나 조이스틱과 같은 다른 하드웨어를 추가하려면 직렬 인터페이스와 통신하는 프로그램을 조정해야합니다.

위의 또 다른 내용은 Arduino를 사용하기 위해 위에 게시 된 것과 비슷하지만 USB 기반 음악 키보드를 처리하기 위해 Sparkfun의 USB Host Shield 도 포함 합니다. 이를 통해 Arduino를 부팅 로더 칩에서 키보드 또는 키보드 마우스 콤보로 프로그래밍 할 수 있으며 장치가 USB 기반 음악 키보드 의 USB 호스트 역할을 할 수 있습니다. 그런 다음 두 유형에 모두 적용됩니다. 그래도 가상 직렬 포트 방법이 더 유연하고 장기적으로 프로그래밍하기가 더 쉽다고 생각합니다. Arduino 장치는 데스크톱 프로그램이나 서비스보다 변경하기가 어렵습니다.

또 다른 가능성이있을 수 있습니다 : 화음 한손 키보드가 이미 존재합니다. 나는 그들에 대한 비디오를 보았지만 손이 다쳤는지 여부를 결정해야 할 것입니다.


7

.NET DirectSound 인터페이스와 같은 것을 사용하여 MIDI 장치에 연결하는 것은 매우 쉽습니다. 대상 MIDI 장치를 식별 한 다음 수신 메시지에서들을 코드를 수신해야합니다 (Google을 통해이를 수행하는 방법에 대한 기사가 있음).

MIDI 입력을 키보드로 사용하기 때문에 기본적으로 감지해야 할 두 가지 MIDI 메시지, 즉 노트 온 및 노트 오프가 있습니다. MIDI 메시지는 명령, 음표 및 속도를 지정하는 3 개의 데이터 바이트입니다. 음표는 음표 번호 일뿐입니다 (때때로 '나쁜'MIDI 스택은 예상되는 속도가 0 인 음표를 보냅니다).

메시지를 번역하면 키보드 출력은 .NET에서 매우 단순해야합니다.

기술에 대한 다른 답변에는 많은 조언이 있습니다. 나는 단지 당신에게 실제 MIDI 메시지에 대한 아이디어를주고 싶었습니다. 행운을 빕니다!


: 보조 노트로 문서 'MIDI 장치를위한 범용 직렬 버스 (USB) 장치 클래스 정의는'MIDI 메시지의 아주 깔끔한 개요를 제공 usb.org/developers/devclass_docs/midi10.pdf
사이먼 여관

7

사운드 카드를 통해 외부 MIDI 키보드를 컨트롤러로 사용하여 사용 하려는 운영 체제 및 / 또는 DAW 프로그램에 관계없이 더 나은 결과를 얻을 수 있습니다. 그런 다음이를 GB 소프트웨어 (또는 기타)로 라우팅하고 톤은 실시간으로 그러한 방식으로 제공 한 많은 사운드를 생성합니다.

사운드 카드가 MIDI I / O (in / outs / thrus)를 지원하지 않으면 문제가되지 않습니다. 외부 MIDI 탁상용 변환기에 대한 연구 및 투자를 고려할 수 있습니다. 많은 사람들이 MIDI 출력을 USB 2.0으로 추가 변환 할 수 있습니다 (기존 사운드 카드를 모두 전달 함).

예를 들어 : 컴퓨터 키보드와 연필 도구를 사용하여 Z 및 X 변경 키 옵션을 통해 "사람과 같은"유예 메모 결과를 얻는 것은 매우 어렵습니다. 대신, 자신의 손가락으로 물리적 옥타브 레지스터 범위의 MIDI 키보드를 사용하여 바로 연주 할 수 있습니다.

예산 제약이 수반 될 수 있음을 알고 있습니다. 그러나 Radio Shack에서 $ 100.00 미만 ($ 이하) 이하로 판매 된이 겉보기 저렴한 "Casio"유형 5 옥타브 키보드 중 일부는 필요한 모든 것입니다 (일부 내장 사운드 패치 및 시퀀서 모듈 사운드 및 핸들 다른 것들도 놀랍도록 잘).

RadioShack MIDI 키보드 옵션 .

기존 사운드 카드의 외부 MIDI 변환기에 관해서는 특별히 Mac 플랫폼을 염두에두고 다음과 같이 Google 검색 을 실행 했습니다 .

이 외부 MIDI 변환 정보는 처음에는 번거로울 수 있으므로 고려 사항 및 예산에 대해 "사용자 친화적"으로 분류했습니다.

DAW를 사용할 때 가상 키보드를 VST 로 사용하는 데 아무런 문제가 없습니다 . 그들은 자신의 자리가 있습니다.

그러나 당신은 뛰어난 키보드 연주자처럼 들립니다. 그렇다면 방금 언급 한 외부 MIDI 변환 / 키보드 옵션을 고려해보십시오.

행운을 빕니다. 이것이 여러분에게 도움이 될만한 아이디어를 주었기를 바랍니다.


6

직접 프로그래밍하고 싶지는 않지만 문제가 해결되기를 원한다면 USB-MIDI 키보드를 구입하면 MIDI 출력 대신 QWERTY 키보드 출력 신호를 보내도록 키를 다시 할당 할 수 있습니다. 예를 들어 M-오디오 공리 프로

MIDI 키보드는 자체를 표준 QWERTY 키보드로 식별하므로이 방법은 표준 USB 키보드를 지원하는 모든 OS 및 모든 컴퓨터에서 작동합니다.


특정 키 스트로크에 코드를 할당 할 수 있는지 알고 있습니까? 예를 들어 C MAJOR 코드를 연주하면 "여우 점프"로 번역 할 수
있습니까

너무 빨리 응답하지 않아서 죄송합니다. 4 일 동안 휴가를 보냈습니다.) 아니요, 안타깝게도 키당 하나의 QWERTY 코드 만 할당 할 수 있으므로 표준 키보드처럼 작동합니다.
Martin Odhelius

Btw, 당신이 하나를 사면, PRO 버전을 구입하는 것을 잊지 마십시오. 비 PRO 버전은 QWERTY 할당 기능이 있다고 생각하지 않기 때문입니다.
Martin Odhelius

코드 당 하나의 키만 ASCII 코드에 코드를 할당하는 것이 가능하지 않다고 생각하지만 오늘 밤 직장에서 집에 돌아올 때 내 Axiom에서 확인할 것입니다.
Martin Odhelius

방금 키보드의 실제 피아노 키가 아닌 컨트롤 버튼 (기능 키, 드럼 패드, 숫자 키 등)에만 쿼티 코드를 할당하는 것이 가능하다는 것을 알았습니다. 나는이 키보드를 직접 소유하고 어떤 키에도 ASCII 코드를 할당 할 수 있다고 확신했지만, 그것을 시도했을 때 그것이 잘못되었음을 알았습니다! 죄송합니다. 어떤 식 으로든 보상을 되돌릴 수 있습니까?
Martin Odhelius

6

간단한 AutoIt 스크립트를 사용하여 MIDI 이벤트를 읽을 수 있습니다 ( MIDI 입력 참조) .

MIDI UDF 가 필요 하고 키 누름을 시뮬레이션 할 수도 있습니다 .

MIDI 이벤트를 읽는 것은 쉽지만 다른 MIDI 컨트롤러 (악기)에는 다른 기능이 있습니다. 먼저 MIDI 피아노가 할 수있는 작업을 찾은 다음 시뮬레이션 된 QWERTY 키보드 프레스에 해당 기능을 가장 잘 매핑하는 방법을 확인하십시오 .

당신이 원하는 경우에, 당신은 당신이 (들면, 그 무엇을하는지 볼 수 있도록 화면이나 트레이에 뭔가를 가질 수 Shift, CtrlAlt시뮬레이션).


5

화음 키보드를 볼 수 있습니다 . 사용하기 전에 드라이버를 작성할 필요가 없다는 장점이 있으며, 일부는 피아노 키보드의 레이아웃과 유사합니다.


5

Java 코딩을 알고 있다면 다음과 같이 사용할 수 있습니다.

먼저 'Note on'이벤트를 원하는 키 입력에 매핑 javax.sound.midi.Receiver하는 send(..)메소드를 사용하여를 구현하십시오 .

getMessage메소드를 사용하여 MidiMessage의 컨텐츠를 가져 와서 사용자의 방식으로 해석해야합니다. 메시지 바이트의 의미는 MIDI 메시지 에서 찾을 수 있습니다 .

특정 키보드 키에 대해 'note on'또는 'note off'를 수신 한 후 KeyEvent 클래스의 상수 (C # 4-> KeyEvent.VK_A 등)를 지정하여 원하는 키에이를 맵핑 할 수 있습니다. . 그런 다음이 키 코드를 java.awt.Robot의 keyPress 및 keyRelease 메소드에서 사용하여 실제로 키 입력을 OS 및 기타 애플리케이션에 보낼 수 있습니다.


4

나는 Brian O'Dell의 대답에 동의합니다. 이것이 내 프로젝트라면 하드웨어로 할 것입니다. 플랫폼과 하드웨어에 독립적이라는 장점이 있습니다. 박스는 MIDI-USB 인터페이스와 PC API의 필요성을 대체합니다.

mbed 는 배우기 매우 쉬운 고속 프로토 타입 플랫폼이며 Arduino IMHO (온라인 컴파일러, 512KB 플래시, 96MHz, C ++ 언어)에 비해 여러 가지 장점이 있습니다. 그것은이 USB 키보드 인터페이스미디 인터페이스 USB 당신을 위해 작성된 사전을.

커뮤니티는 매우 친근하고 기꺼이 도와주고 기꺼이 MIDI 및 USB hid 에뮬레이션을 사용하는 기존 프로젝트가 많이 있습니다. 유튜브에서 "mbed MIDI"등을 검색하십시오.


4

Linux를 사용하는 경우 Footware를 사용하십시오 .

원하는 것을 정확하게 찾으십시오-원하는대로 키 피치로 MIDI 피치를 조정하면 ...

나는 이것이 나 이외의 사람에게는 유용 할 것이라고 생각하지 않았다.


2
관리자로서의 이전 직업에서 나는 책상 아래에 발판을 설치했습니다. vim에 홈 행을 남기는 것을 최소화하기 위해
FlashKorten


1

이것은 어렵지 않습니다.

나는 당신이 Windows 에 있다고 가정 하고 있지만, 확실하지 않습니다. 평범한 오래된 C ++MIDI 시퀀서 http://pianocheetah.com을 작성 했으며 피아노 키보드를 사용하여 명령을 실행할 수 있습니다. 키보드 입력 스트림으로 키를 누르는 것과 같은 일을 할 수 없었던 이유는 없습니다.

하지만 어서 처음부터 키보드를 배우는 데 얼마나 걸 렸는지 기억하십니까? 다시 하시겠습니까? 그리고 축복받은 키보드를 어리석게 보이는 열쇠 기호로 오염시킬 의향이 있습니까?

최소 26 개의 알파, 10 개의 숫자, 11 개의 구두점 및 12 개 이상의 기능 키와 이동 된 상태를 사용해야합니다. 60 개의 키와 시프트 된 상태입니다. 5 옥타브의 키를 태울 것입니다. 당신은 피아노 "홉"을 할 것입니다 = 모든 = 시간. 타이핑을 터치하면 작별 인사를합니다.

RSI 에서 자신을 구할 수는 있지만 다른 유형의 악몽을 만들었습니다.

그리고 직장에서 당신의 상사가 당신에게 MIDI 키보드를 사도록하는 행운을 빕니다.

진정한 피아노 연주법을 배웠다면 스트레스없이 연주하는 법을 배웠습니다. 온 그렇게 쿼티 (QWERTY) 키보드. 긴장이 없습니다. 천천히 시작하십시오.


친절한 말에 감사하지만, 나는이 일에 엉덩이를 썼고 그것을 오픈 소스로 만들 계획은 없습니다. 미안합니다. 그러나 나중에해야 할 일은 midiInOpen (); 미디 입력을 처리하기위한 콜백을 제공합니다. 노트 다운 이벤트를 제외한 모든 것을 무시하고 미디 노트를 키보드 키에 매핑하고 키보드 입력 스트림에 삽입하십시오 (필자는 API를 잊어 버리지 만 적어도 하나는 확실합니다).
Stephen Hazel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.