Usando um teclado de piano como teclado de computador [fechado]

727

Tenho problemas de RSI e tentei 30 teclados de computador diferentes, o que me causou dor. Tocar piano não me causa dor. Toco piano há cerca de 20 anos sem problemas de dor. Gostaria de saber se existe uma maneira de capturar MIDI a partir de um teclado MIDI e emitir toques de teclado. Não sei nada sobre MIDI, mas gostaria de algumas orientações sobre como converter esse sinal em um pressionamento de tecla.

Peter Mortensen
fonte
por que capturar midi, se você pode usar um teclado sintetizador como teclado?
shevski
@I__: Qual sistema operacional você precisa suportar? Provavelmente será importante.
TJ Crowder
5
@shevski: Eu não estou tentando fazer nada, @I__ é a pessoa que faz a pergunta. Ele não está procurando converter som , mas sim os sinais de eventos do teclado digital enviados pelos teclados eletrônicos via Interface Digital de Instrumento Musical . São muito parecidos com os eventos do teclado do computador: "Anotar" corresponde muito ao pressionamento de teclas, "anotar" a digitação, etc. Você pode até usar os dados de velocidade para executar ações diferentes, dependendo da intensidade da execução do acorde. Eu amo a ideia.
TJ Crowder
34
Se você conseguir que isso funcione, é possível codificar usando qualquer tipo de dispositivo midi. Provavelmente é preciso alguma prática, mas usar uma orquestra como equipe de desenvolvimento deve ser divertido.
Toon Krijthe
1
@I__: A resposta mais votada aponta para o suporte MIDI da API de som Java, que deve permitir que você receba dados MIDI, e descreve em detalhes a teoria envolvida em transformar isso em séries de pressionamentos de tecla. A segunda resposta mais votada fala sobre uma maneira muito viável de conectá-la a um computador usando um Arduino, incluindo ... (continua)
TJ Crowder

Respostas:

16

Uma boa biblioteca em .NET com suporte total a midi (BASS), acesse http://www.un4seen.com .

E, por outro lado, traduzindo notas midi do teclado em teclas e muito mais, eu usaria o AutoItX, a interface ActiveX / COM e DLL no autoIt. Informações e download, acesse http://www.autoitscript.com/site/autoit/

Não há necessidade de escrever o driver do teclado.

eln
fonte
430

Não faço programação MIDI há anos, mas sua ideia fundamental é muito sólida (sem trocadilhos).

MIDI é um fluxo de "eventos" (ou "mensagens"), dois dos mais fundamentais sendo "note on" e "note off" que carregam com eles o número da nota (0 = C cinco oitavas abaixo do meio C, através de 127 = G cinco oitavas acima do G acima do meio C, em semitons). Esses eventos carregam um número de "velocidade" em teclados sensíveis à velocidade ("sensíveis ao toque"), com uma força de (você adivinhou) entre 0 e 127.

Entre a velocidade, as cordas e os pedais, acho que você poderia criar uma interface de "digitação" bastante boa para o teclado do piano. A gravação em particular pode ser uma técnica muito poderosa - como mencionei nos comentários, é por isso que os estenógrafos comuns podem usar uma máquina de estenótipo para acompanhar as pessoas conversando por horas seguidas, quando até os datilógrafos de primeira linha não ' por um longo período de tempo através de teclados normais no estilo de máquinas de escrever. Como na estenografia de máquinas, você precisa de um "dicionário" dos significados dos acordes e das seqüências de acordes. (Você pode dizer que eu costumava trabalhar no lado do software da estenografia da máquina?)

Para fazer isso, as peças fundamentais são:

  • Recebendo entrada MIDI. Não tente fazer isso sozinho, use uma biblioteca. Edit : Aparentemente, a Java Sound API suporta MIDI , incluindo o recebimento de eventos de controladores MIDI. Legal. Esta página também pode ser útil.
  • Convertendo esses dados nas teclas que você deseja enviar, por exemplo, através do dicionário que mencionei acima.
  • Saída das teclas digitadas no computador.

Para ser o mais amplamente compatível com o software, você teria que escrever isso como um driver de dispositivo do teclado. Este é um plug-in para o sistema operacional que serve como fonte para eventos do teclado, conversando com o hardware subjacente (no seu caso, o teclado do piano). Para Windows e Linux, você provavelmente vai querer usar C para isso.

No entanto, como você está apenas gerando pressionamentos de tecla (sem tentar interceptá-los, o que eu estava tentando fazer anos atrás), você poderá usar os recursos que o sistema operacional tiver para enviar pressionamentos de teclas artificiais. O Windows tem uma interface para fazer isso (provavelmente várias, a única em que estou pensando é, SendInputmas sei que há alguma interface de "diário" que faz algo semelhante) e tenho certeza que outros sistemas operacionais também o fazem. Isso pode ser suficiente para seus propósitos - é onde eu começaria, porque a rota do driver de dispositivo será estranha e você provavelmente precisará usar uma linguagem diferente do Java. (Sou um grande fã de Java, mas as interfaces que os sistemas operacionais usam para conversar com os drivers de dispositivo tendem a ser mais facilmente consumidas via C e similares.)


Atualização : Mais informações sobre o "dicionário" de acordes para pressionamentos de teclas:

Basicamente, o dicionário é um trie (obrigado, @Adam) que pesquisamos com a correspondência de prefixo mais longo. Detalhes:

Na estenografia da máquina, o estenógrafo escreve pressionando várias teclas na máquina de estenótipo ao mesmo tempo e, em seguida, liberando todas elas. Eles chamam isso de "toque" do teclado; é como tocar um acorde no piano. Os traços freqüentemente (mas nem sempre) correspondem a uma sílaba da língua falada. Assim como as sílabas, às vezes um toque (acorde) tem significado por si só, outras vezes ele só tem significado combinado com os movimentos seguintes. (Pense "bom" vs. "bom" seguido de "tchau"). Embora eles sejam fortemente influenciados pela escola em que estudaram, cada estenógrafo terá seu próprio "dicionário" de quais traços eles usam para significar o que, um dicionário que eles continuamente aprimorarão ao longo de suas vidas profissionais. O dicionário terá entradas em que a parte estenográfica ("steno", para abreviar) tem um curso ou vários tempos. Freqüentemente, haverá várias entradas com o mesmo golpe inicial, diferenciadas pelo comprimento e pelos movimentos subsequentes. Por exemplo (e eu não usarei o steno real aqui, apenas espaços reservados), pode haver estas entradas:

A = alfa
A / B = alfabeto
A / B / C = alfabético
A / C = ar condicionado
B = abelha
B / C = porque
C = mar
D = cachorro
D / D = Dee Dee

(Essas cartas não devem ser notas musicais, apenas marcadores abstratos.)

Observe que Ainicia várias entradas e também como a tradução de um Ctraçado depende se você já viu um A, a Bou se está começando de novo.

Observe também que (embora não seja mostrado na amostra muito pequena acima), pode haver várias maneiras de "reproduzir" a mesma palavra ou frase, em vez de apenas uma. Os estenógrafos fazem isso para facilitar o fluxo de uma palavra anterior para a seguinte, dependendo da posição da mão. Existe uma analogia óbvia com a música, e você pode usar isso para tornar a digitação mais parecida com a música, tanto para impedir que isso afete negativamente a execução do seu piano quanto para maximizar a probabilidade de realmente ajudar com o RSI.

Ao traduzir steno em texto padrão, novamente usamos uma pesquisa de "correspondência de prefixo mais longo": o algoritmo de tradução começa com o primeiro toque já escrito e procura entradas que começam com esse toque. Se houver apenas uma entrada e for um toque, poderemos dizer com segurança "essa é a entrada a ser usada", produzir o texto correspondente e começar novamente com o próximo toque. Mas o mais provável é que esse traçado inicie várias entradas de diferentes comprimentos. Então, olhamos para o próximo traço e vemos se há entradas que começam com esses dois traços em ordem; e assim por diante até conseguirmos uma partida.

Portanto, com o dicionário acima, suponha que vimos essa sequência:

ACBBCABCABD

Veja como o traduziríamos:

  1. Aé o início de três entradas de comprimentos variados; veja o próximo golpe:C
  2. A/Ccorresponde apenas a uma entrada; saída "ar condicionado" e começar de novo com o próximo curso:B
  3. Binicia duas entradas; veja o próximo golpe:B
  4. B/Bnão inicia nada; pegue a correspondência anterior mais longa ( B) e produza que ("bee")
  5. Tendo output B= "bee", ainda temos um Bacidente vascular cerebral em nosso buffer. Ele inicia duas entradas, então veja o próximo traço:C
  6. B/Ccorresponde a uma entrada; output "because" e comece do zero com o próximo golpe:A
  7. Ainicia três entradas; veja o próximo golpe:B
  8. A/Binicia duas entradas; veja o próximo golpe:C
  9. A/B/Ccorresponde apenas a uma entrada; output "alfabético" e comece do zero com o próximo toque:A
  10. Ainicia três entradas; veja o próximo golpe:B
  11. A/Binicia duas entradas; veja o próximo golpe:D
  12. A/B/Dnão corresponde a nada, portanto, pegue a correspondência anterior mais longa ( A/B) e use-a para gerar "alfabeto". Isso nos deixa Dainda no buffer.
  13. Dinicia duas entradas, para que normalmente analisássemos o próximo golpe - mas processamos todos os movimentos, então considere-o isoladamente. Isoladamente, ele se traduz como "cachorro", então é isso.

Aspectos acima para observação:

  • Você tem um buffer de traços que leu, mas ainda não traduziu.
  • Você sempre deseja combinar o maior número de traços com uma única entrada possível. A/Bdeve ser traduzido como "alfabeto", não "alfa" e "abelha".
  • (Não mostrado acima) Você pode ter sequências de traços que não pode traduzir, porque elas não correspondem a nada no dicionário. (As pessoas Steno usam o substantivo "não traduzido" - por exemplo, em nosso dicionário, os traços Eseriam "não traduzidos".)
  • (Não mostrado acima) Algumas teorias do steno permitem que o mesmo conjunto de traços signifique mais de uma coisa, com base em um contexto mais amplo. Os steno chamam esses "conflitos". Você provavelmente deseja proibi-los em seu projeto e, de fato, quando o steno costumava ser traduzido manualmente pelo estenógrafo, os conflitos eram bons porque eles sabiam exatamente onde na sentença estavam qual era a escolha certa, mas com o aumento da tradução automática, surgiram teorias de steno sem conflito especificamente para evitar a necessidade de passar pelo texto traduzido resultante e "consertar" os conflitos.
  • Traduzir em tempo real (o que você faria) significa que, se você receber uma correspondência parcial, vai querer se apegar a ela enquanto aguarda o próximo acorde - mas provavelmente apenas com um tempo limite, no momento em que deseja traduza o que você tem no buffer da melhor maneira possível. (Ou talvez você não queira um tempo limite; a decisão é sua.)
  • Provavelmente é melhor ter um derrame que diga "desconsidere o derrame anterior"
  • Provavelmente é melhor ter um golpe que diga "limpe completamente o buffer sem emitir nada"
TJ Crowder
fonte
6
@I__: Alguns programas tentam falar diretamente com o dispositivo do teclado e, portanto, não tocam bem com interfaces semelhantes a "sendkeys". Espero que isso seja ainda menos comum agora do que há alguns anos atrás, quando lidei com isso pela última vez, e assim como eu digo, eu começaria com "sendkeys" como mecanismos e só me preocuparia com o outro se e quando você precisasse. (Provavelmente, é melhor fazer um teste rápido do programa enviando chaves [por conta própria, sem recebê-las do MIDI] - incluindo seqüências especiais de teclas - e depois testando isso com o software que você deseja controlar antes de ir muito longe no caminho .)
TJ Crowder
7
Para quem nunca ouviu falar deste, dicionário que você descreve é basicamente um Trie (pronuncia-se 'try')
Adam
14
@ I__: Interessante escrever agora para dizer isso. O que mais você quer? Penso que abordei muitos dos aspectos importantes do que você precisa fazer. Eu não fiz isso, nem apontei para quem o fez, porque tenho outras coisas para fazer e não sei de uma solução pré-criada. Mas, em termos de construção de uma solução, acho que direcionei você na direção certa.
TJ Crowder
2
Observe que você pode congestionar todos os acordes em uma matriz linear e percorrer toda vez que receber um evento midi, e ainda não sofrer uma desaceleração perceptível. Usar um trie cheira um pouco a otimização prematura.
FeepingCreature
5
@FeepingCreature: Quando eu fazia isso com estenógrafos e repórteres de tribunais, seus dicionários podiam facilmente chegar a centenas de milhares de entradas (lembro-me de alguém que quebrou a marca do milhão). Não havia nada remotamente prematuro em usar uma estratégia de otimização; estávamos lidando com 386s de 12 MHz. No caso de I___, se ele concorda com a idéia do Arduino (que é uma idéia muito interessante), ele também estará lidando com hardware bastante pouco potente para a era moderna, embora, obviamente, coisas ridiculamente mais rápidas do que tínhamos. Eu acho que o dicionário dele tenderia a ser drasticamente menor, mas ...
TJ Crowder
184

Considere fazer algo no hardware que emula um teclado usb (ou ps / 2?). Você não será mais dependente de um sistema operacional específico ou de uma API específica do sistema operacional. Uma solução de hardware resistirá ao teste do tempo. Não fique preso usando uma API antiga no Windows 7 quando todos os outros estiverem executando o Windows 11! O Arduino é muito fácil de aprender.

Há uma tonelada de informações e ajuda para o Arduino. É uma plataforma de hackers de hardware criada para iniciantes. Só ficará maior agora que o Google está pressionando o Arduino.

EDIT: Software e hardware do teclado virtual USB

Brian O'Dell
fonte
Eu amo a idéia de usar um Arduino para isso. A memória pode ser um problema, no entanto. Parece que as maiores placas pré-projetadas possuem 256k de Flash (dos quais 8k são usados ​​pelo gerenciador de inicialização). Naquela época, colocávamos tradução / exibição / edição em tempo real da abreviação de máquina em 1M no DOS (por exemplo, os 640k usuais mais EMS ou memória estendida), mas estávamos escrevendo código C, montagem e o dicionário (o que poderia facilmente) ter> 250k por conta própria) estava no disco. Aqui há haver exibição ou edição simultânea, de modo que é bom, mas o dicionário terá de ser pequeno ...
TJ Crowder
Oh, isso não é nada. Eu lidei rotineiramente com repórteres da corte que tinham dicionários que, mesmo armazenados na forma muito compacta que usamos, tinham vários megabytes de tamanho. O maior que vi pessoalmente foi de 4,5 MB - e, novamente, ele foi armazenado em uma forma altamente compactada. Combine isso com o fato de que há menos teclas em um teclado steno do que um teclado de piano ... No entanto, o Arduino possui uma porta USB; portanto, o dicionário pode estar em um adaptador flash USB ou até mesmo em uma fonte externa. ) SSD ou HDD.
TJ Crowder
2
Você pode considerar um pequenino em vez de um arduino ( pjrc.com/teensy ) significativamente mais memória e pode emular diretamente um teclado. Já é compatível com muitas bibliotecas do arduino e as incompatíveis exigem apenas a reatribuição de pinos. - alternadamente, atmega também faz uma placa de demonstração que tem 16 MB de flash embutido e custa cerca de $ 30 (AT90USBKEY)
Marc
8
Projetar uma interface de piano útil para um computador não é uma tarefa fácil. IMHO, o OP deve primeiro prototipá-lo em seu ambiente atual e, se satisfizer suas necessidades, se preocupe com a portabilidade. A menos, é claro, que a alternativa portátil não seja visivelmente mais difícil.
Emilio M Bumachar
111

Parece-me que você está procurando menos conselhos sobre como construir isso sozinho e mais perguntas sobre quais recursos já existem para realizar o que deseja. Dependendo do seu sistema operacional, existem várias maneiras de fazer isso sem precisar escrever seu próprio programa do zero:

Curso MIDI

Livre. Para Mac OS X 10.3 e superior . Este vem especificamente com "a capacidade de usar qualquer teclado MIDI como uma substituição completa do teclado do computador".

Tradutor MIDI da Bome

Free / Postcardware (é um pouco estranho). Para Windows 2000 e para cima, e Mac OS X . Inicialmente, parece ser mais voltado para o uso do tipo AutoHotkey , mas, olhando mais adiante, acho que poderia fazer o que você deseja.

Max e aka.keyboard

Livre. Para Mac OS X . Não é exatamente uma solução "pronta para uso", mas se você se sentir confortável com a configuração básica do dispositivo, não deve ser tão ruim.

kathryn
fonte
49

Você pode acessar o hardware com exemplos de código-fonte no .NET no MIDI DotNet .

Um exemplo completo de trabalho como código-fonte para criar fluxo de dados de notas MIDI está no VB 5/6-Tipp 0521: MIDI-Töne erzeugen (Visual Basic 6.0, em algum lugar também é a versão .NET)

Uma maneira de simular toques de teclado é no VB 5/6-Tipp 0155: Tastaturereignisse simulieren (Visual Basic 6.0, em algum lugar também está na versão .NET)

E o reconhecimento de pressionamentos de teclas é descrito em Tipp-Upload: VB.NET 0266: Globaler KeyHook .

Digite a descrição da imagem aqui

Em seguida, basta usar uma boa matriz de trabalho para um pianista Timo Boehme www.goldengel.ch

No piano e quando você é um bom tocador, pode ter 10 dedos no teclado e, se a matriz for utilizável, pode ser muito mais rápido que qualquer usuário de teclado de computador. :-)

Nesse caso, se entendi bem sua pergunta, não deve ser uma grande coisa.

Nasenbaer
fonte
41

Estudei performance de piano na faculdade e depois entrei em design de interação, programação e uso do Vim , então, na verdade, passei muito tempo criando protótipos de coisas como essa.

Você pode fazer isso funcionar rapidamente no Linux usando a linguagem de programação gráfica para artistas de multimídia, " Pure Data ", junto com o x11key externo de Alex Andre .

No Mac, você pode usar o MidiStroke . Acredito que um método no Windows envolva as ferramentas MidiOx e AutoHotKey . Em outra época, tive uma versão usando o plug-in Java para Max / MSP . Acredito que Patrice Colet criou uma janela externa para o Pure Data que também funcionou, mas não consigo mais localizá-lo. Além disso, há um externo para o MaxMSP que pode fazer isso no Windows. Por fim, o Osculator , que não é gratuito, mas incrível, pode fazer o que você quiser - consulte a página de recursos.

Quando o fiz funcionar, nunca fiquei preso, porque não conseguia parar de trabalhar com o layout. Foi legal ter meu monitor no teclado elétrico! Boa sorte.

Peter Nore
fonte
37

Sobre o MIDI

Você afirmou que "não sabe nada sobre MIDI". A tecnologia MIDI é bastante direta quando você a compreende, mas pode ser confusa desde o início. Um dos recursos que me foi tremendamente útil para entender os fundamentos do MIDI (que certamente são necessários se você deseja programar interações MIDI) é um livro chamado MIDI para o Technophobe . É um livro fácil de ler e é muito útil.


Pure Data & Max

Na minha experiência no desenvolvimento de multimídia interativa, encontrei dois programas muito semelhantes que facilitam a conexão e o mapeamento de sinais / entradas de qualquer dispositivo.

Estes são Max para um ambiente Mac e Pure Data para um ambiente PC. Ambos têm uma infinidade de documentação on-line e tutoriais do YouTube. O vídeo Max / MSP Tutorial 1 - usando o teclado do computador como meio do teclado (estilo ableton) demonstra um programa construído no Max que mapeia o teclado do computador para as entradas de um teclado MIDI (que é basicamente o oposto do que você está tentando fazer). Você pode obter os resultados pretendidos usando o mesmo padrão, mas revertendo os sinais / mapeamentos.


AutoHotKey

O AutoHotKey é um utilitário de código aberto gratuito para Windows que permite remapear as teclas e os botões dos seus dispositivos para macros. Ele suporta nativamente teclados QWERTY, joysticks e macros de mouse.

No entanto, consegui encontrar uma implementação que suporte o mapeamento específico que você está procurando. Esses dois threads explicam o processo:

  1. Suporte MIDI IN no AutoHotkey , a discussão do caso de uso. O autor procurava um programa que pudesse detectar a entrada MIDI IN e traduzi-lo para pressionamentos de tecla .

  2. Biblioteca de entrada MIDI , a solução para o problema do autor e o código / patch publicado no AutoHotKey que realmente implementa o resultado pretendido.

Basicamente, parece que o AutoHotKey, junto com o patch personalizado deste usuário, fornecerá exatamente o que você precisa para criar um mapeamento de um teclado MIDI para o sinal de entrada de um teclado QWERTY. Tudo o que você precisa fazer é instalar, configurar e definir seus mapeamentos.


Algo mais?

Algumas das outras respostas forneceram informações muito mais abrangentes sobre programação MIDI e MIDI, em geral, mas, como diz o seu post, isso não parece exatamente o que você está procurando. Gostaria de ajudá-lo mais, se possível, mas seria mais fácil se você pudesse ser mais específico sobre o tipo de informação que está procurando. Por exemplo, você está mais interessado em converter os sinais de entrada de um teclado MIDI em sinais de um teclado QWERTY ou o seu interesse principal é encontrar uma solução pronta para o seu problema específico? O que você está procurando que ainda não foi abordado?

smartcaveman
fonte
27

Você pode invadir seu próprio teclado USB rapidamente usando um micro controlador Teenys.

De fato, eles têm um código de exemplo de como criar um teclado USB .

Você pode abordar isso de duas maneiras:

  1. Adquira um piano velho e conecte interruptores diretamente ao pequenino

  2. Adicione a lógica adicional para conectar à porta MIDI e a decodificação necessária.

cmcginty
fonte
Essa é a resposta mais promissora porque, depois de concluir os dispositivos, ele funcionará em qualquer computador e em qualquer sistema operacional. Leve-o para o trabalho ou fique feliz por poder atualizar seu computador sem se preocupar com o teclado. Eu usaria dois dispositivos Teensy e os conectaria com seus pinos de E / S. Como o Teensy já suporta USB MIDI pjrc.com/teensy/td_midi.html, seu código precisa apenas cuidar dos sinais de movimento entre o teclado entre adolescentes e o meio das adolescentes.
Michael Dillon
24

Na verdade, eu trabalhei nisso há um tempo atrás, tentando capturar as entradas de bateria do Rock Band no meu computador (criando um pequeno emulador de bateria caseiro Java) De qualquer forma, fiz uma pergunta aqui sobre isso, problema de atraso de tempo (há código de pesquisa lá , junto com o que eu estava tentando fazer.). E se eu encontrar meu programa, posso fornecer o código, ele usa uma API de terceiros ( JInput ).

Boa sorte de qualquer maneira.

Brendan
fonte
23

Experimente o tradutor MIDI da Bome .

Funciona em várias plataformas, pode converter qualquer MIDI entrada em um keytoke facilmente, rápido de instalar e configurar, além de ser gratuito para uso pessoal.

Há um tutorial, Dica rápida: Tradução MIDI - MIDI para pressionamentos de teclas , sobre como configurá-lo facilmente:

Basicamente, existem infinitas possibilidades do que você pode fazer, incluindo teclas de modificação e modificação. Eu o uso no meu equipamento de áudio ao vivo para controlar minha DAW usando meu piano e nunca tive um problema.

stepheninohio
fonte
18

Em Java, você pode usar o JMF (estrutura Java Media) para converter sinais MIDI. O design básico do teclado é fácil de usar, ou seja, a interface do usuário; e coloque à mão os caracteres / símbolos usados ​​com freqüência.

O código de exemplo e a API em Java Sound Resources: Exemplos: DSP (Digital Signal Processing) ajudam a entender como processar o sinal.

Mais algumas referências:

Kamahire
fonte
15

Existe um programa chamado GlovePIE . Você pode programá-lo em uma linguagem de script simples e acredito que ele suporta MIDI. Não tenho certeza se isso se encaixa na categoria "Java", mas ainda assim, é um ótimo programa. Eu usei-o para controlar robôs usando controladores PS3 . É muito poderoso.

Peter Mortensen
fonte
15

Muitos teclados possuem um conector de porta serial ( RS-232 ) para enviar sinais MIDI ao computador. Eu uso um programa chamado Girder para converter a comunicação da porta serial em toques no teclado.

A viga possui um recurso de "mapeamento" que permite mapear cada tecla, uma por uma, para o pressionamento de tecla correspondente.

Esta pode ser a solução simples que você está procurando!

Scott Rippey
fonte
12

Apenas aprenda estenografia!

Está claro em toda a discussão da sua parte. Você não deseja reinventar nenhuma roda, do ponto de vista técnico. Mas uma vez que você tenha feito uma conexão (o que esta pergunta está perguntando) e funcionando, você ainda terá a maior parte do trabalho pela frente: você precisa treinar seu cérebro. Você também precisa inventar a maneira mais inteligente e eficiente de fazer isso - um problema de design totalmente fora do mundo dos técnicos em informática. Você ou qualquer um de nós ficaria aquém.

Felizmente, o problema foi resolvido e aperfeiçoado durante séculos de amadurecimento ...

Aprenda estenografia!

Sim, isso fará com que você volte a usar algum conector. Mas quanto vale centenas de horas de seu tempo, com no final, um resultado menos favorável? Além disso, o artigo da Wikipedia sobre estenografia diz: "parece mais um teclado de piano".

A menos, é claro, que você queira ter um efeito de exibição lateral. Eu teria que admitir, nunca pensei nessa possibilidade, seria realmente divertido ver alguém pegar um texto de um teclado de piano!

Você pode começar com um teclado USB com touchpad (ou um apontador seria mais ergonômico?), Use o Plover para traduzi-lo (tenho certeza de que pode ser configurado para permitir que as teclas que não sejam da letra mantenham sua funcionalidade, pois são críticas para programação) ou siga o tópico Re: Plover keyboard para rolar seu próprio teclado de estenografia USB ou compre um estenótipo .

Boa sorte!

FastAl
fonte
Onde estão {e} no teclado da estenografia? Como você vai digitar nomes que não são palavras, como pthread?
bobobobo
O link da wikipedia está errado e deve ser en.wikipedia.org/wiki/Stenography
joelhoro
11

Dê uma olhada nos jogos de arcade MAME . Eles criaram dispositivos de hardware para permitir a entrada de qualquer número de itens diferentes. O iPac , por exemplo, converte sinais de dispositivos de entrada em USB que o computador pode usar para emular teclas. Você pode usar qualquer combinação de dispositivos de entrada dispostos de qualquer maneira que pareça confortável, sem lógica lógica de programação necessária - porque o software para interpretar as entradas já está pronto e bem testado.

Vi entradas do cockpit do simulador de vôo, quiosques personalizados e sistemas de votação criados neste método ..... e o preço é justo!

bpeterson76
fonte
10

Para resolver isso, você precisará de algumas coisas:

  1. Uma maneira de capturar dados MIDI do seu teclado. Dependendo da interface: interface MIDI (clássica) ou interface USB MIDI (moderna), a interface mais provável é para um computador, pois oferece mais opções. Os microcontroladores host USB não são tão simples quanto usar um computador.

  2. Um esquema para converter dados MIDI em pressionamentos de teclas. Como um usuário apontou, os acordes são o caminho a percorrer, pois o número de teclas não depende do número de teclas do piano.

  3. Uma maneira de injetar uma chave no sistema operacional. Isso exigirá que um driver de baixo nível seja preciso. Eu brinquei com aplicativos que injetam dados de teclado e mouse em aplicativos no Windows 7, e isso pode ser um problema e depende se um aplicativo está atualmente em foco. Esta é a parte mais difícil da interface. O que pode funcionar é criar um microcontrolador de teclado USB HID que também tenha uma interface serial.

A interface serial criaria uma porta serial virtual. O software que lê os dados MIDI e produz as teclas pressionadas pode enviar uma mensagem serial para a porta serial virtual. O microcontrolador envia um pressionamento de tecla para parecer uma entrada de teclado padrão. Isso permitiria interface entre as portas MIDI e os teclados USB MIDI.

Hmmm, com esse tipo de interface, você também pode simular um mouse e usar algumas configurações de teclas de piano para o eixo e os botões do mouse. A pressão pode ser usada para determinar a velocidade do ponteiro do mouse. Então você pode eliminar o mouse também. Outro benefício dessa abordagem é que qualquer tipo de dispositivo de entrada que você conectar poderá conversar com a porta serial virtual para produzir eventos de teclado e mouse. Portanto, se você quiser adicionar outro hardware, como pedais de bateria ou um joystick, seria uma questão de ajustar o programa que fala com a interface serial.

Outra abordagem acima é como algumas postadas acima para usar um Arduino, mas também incluem o USB Host Shield da Sparkfun para lidar com teclados de música baseados em USB. Isso permite que o Arduino seja programado como uma combinação de teclado ou mouse no chip do carregador de inicialização e permite que o dispositivo atue como host USB para o teclado musical baseado em USB. Então você está coberto para os dois tipos. Embora eu ainda ache que o método da porta serial virtual é mais flexível e seria mais fácil de programar a longo prazo. O dispositivo Arduino será mais difícil de alterar do que um programa ou serviço de desktop.

Há outra possibilidade: os teclados com uma mão já estão disponíveis. Eu já vi vídeos neles, mas você teria que determinar se eles machucam suas mãos ou não.

Demolishun
fonte
7

Deve ser bastante fácil usar algo como a interface do .NET DirectSound para conectar-se a um dispositivo MIDI. Você precisará identificar seu dispositivo MIDI de destino e, em seguida, obter o código para ouvir as mensagens recebidas (há artigos sobre como fazer isso via Google).

Como você está usando o MIDI como teclado, existem basicamente apenas duas mensagens MIDI que você precisa detectar, a saber, ligar e desligar. A mensagem MIDI tem três bytes de dados especificando o comando, a nota e a velocidade. A nota desativada é apenas o número da nota (às vezes pilhas MIDI 'ruins' enviam uma nota com velocidade zero, o que você também deve esperar).

Depois de as mensagens serem traduzidas, a saída do teclado deve ser bastante simples do .NET.

Há muitas dicas nas outras respostas sobre os detalhes técnicos; Eu só queria dar uma idéia das mensagens MIDI reais. Boa sorte!

Simon Inns
fonte
Como observação lateral, o documento 'Definição de classe de dispositivo de barramento serial universal para dispositivos MIDI' fornece uma visão geral muito organizada das mensagens MIDI: usb.org/developers/devclass_docs/midi10.pdf
Simon Inns
7

Você obterá resultados melhores e mais felizes (independentemente do sistema operacional e / ou programa DAW que você gosta de usar) tocando em qualquer teclado MIDI externo como controlador pela placa de som. Em seguida, direcione isso para o software GB (ou o que for) e o tom gere os muitos sons que eles forneceram dessa maneira em tempo real.

Se a sua placa de som não suportar E / S MIDI (entradas / saídas / thrus), isso não é problema. Você pode pesquisar e investir em um conversor de mesa MIDI externo. Muitos estão equipados para converter ainda mais saídas MIDI para USB 2.0 (ignorando completamente uma placa de som existente).

Por exemplo: é muito difícil obter resultados de notas de cortesia "semelhantes a humanos" por meio da opção de tecla Z e X, usando uma ferramenta de teclado e lápis do computador. Quando, em vez disso, seus próprios dedos podem tocar isso com um teclado MIDI de seus próprios intervalos físicos de registro de oitavas - imediatamente!

Percebo que restrições orçamentárias podem estar envolvidas. Porém, alguns desses teclados de oitava "Casio" do tipo 5 de oitava, vendidos na Radio Shack por menos de US $ 100,00 dólares (* ou menos), são tudo o que você precisa (além disso, alguns de seus patches de som e módulos de seqüenciador integrados soam e manipulam incrivelmente bem para outras coisas também).

Opções de teclado RadioShack MIDI .

Quanto aos conversores MIDI externos para placas de som existentes, realizei algumas pesquisas no Google para você da seguinte maneira, com plataformas Mac especificamente em mente:

Muitas dessas informações externas de conversão de MIDI podem ser complicadas para você no começo; portanto, detalhamos as coisas como "amigáveis" para suas considerações e orçamento:

Não há nada errado em facilitar teclados virtuais como VST ao usar DAW . Eles têm o seu lugar.

Mas você parece um tecladista talentoso. Então, por que não considerar as opções externas de conversão / teclado MIDI que acabei de mencionar?

Boa sorte e espero que isso tenha lhe dado algumas idéias que podem e irão funcionar para você!

Angshuman Bhattacharjee
fonte
6

Se você não quiser programar sozinho, mas apenas resolver o problema, basta comprar um teclado USB-MIDI, onde poderá redesignar qualquer tecla para enviar um sinal de saída do teclado QWERTY em vez de uma saída MIDI, por exemplo M-Audio Axiom Pro

Este método funcionará com qualquer sistema operacional e qualquer computador que suporte teclados USB padrão, já que o teclado MIDI se identificará como um teclado QWERTY padrão.

Martin Odhelius
fonte
você sabe se seria possível atribuir acordes a pressionamentos de tecla específicos também? por exemplo, se eu tocar o acorde C MAJOR, posso traduzi-lo para "a raposa pulou"
l --''''''--------- '' '' '' '' '' ' '
Desculpe por não responder tão rápido, tive férias por 4 dias;) Não, infelizmente, você só pode atribuir um código QWERTY por tecla, por isso funciona como um teclado padrão.
Martin Odhelius
Aliás, se você comprar um, lembre-se de comprar o PRO-one, porque não acho que a versão não-PRO tenha a funcionalidade de atribuição QWERTY.
Martin Odhelius
Eu não acho que seja possível atribuir acordes a códigos ASCII, apenas uma chave por código, mas vou verificar isso sozinho no Axiom hoje à noite quando chegar em casa do trabalho.
Martin Odhelius
Acabei de notar que só é possível atribuir códigos qwerty aos botões de controle (teclas de função, pads de bateria, teclas numéricas etc.), e não às teclas de piano reais do teclado. Eu mesmo possuo este teclado e tinha certeza de que era possível atribuir códigos ASCII a qualquer tecla, mas agora, quando o experimentei, percebi que estava errado! Sinto muito por isso, é possível reverter a recompensa de alguma forma?
Martin Odhelius
6

Você pode usar um script AutoIt simples para ler eventos MIDI, consulte Entrada MIDI .

Você também precisará de MIDI UDF e simular pressionamentos de tecla .

A leitura de eventos MIDI deve ser fácil, mas diferentes controladores MIDI (instrumentos) têm recursos diferentes. Tente descobrir o que o seu piano MIDI pode fazer primeiro e, em seguida, veja como você pode mapear melhor esses recursos para prensas de teclado QWERTY simuladas .

Se você quiser, poderá ter algo na tela ou na bandeja para ajudá-lo a ver o que está fazendo (ou seja Shift,Ctrl e Altsimulação).

Martijn
fonte
5

Você pode dar uma olhada nos teclados com acordes . Eles têm a vantagem de que você não precisa escrever um driver para eles antes de poder usá-los, e alguns são semelhantes ao layout de um teclado de piano.

Peter Mortensen
fonte
5

Se você conhece a codificação em Java, pode usar desta maneira:

Primeiro, implemente um javax.sound.midi.Receivercom umsend(..) método que esteja mapeando os eventos 'Nota sobre' para as teclas digitadas como você deseja.

Você precisaria obter o conteúdo do MidiMessage com seu getMessagemétodo e interpretá-lo da sua maneira. O significado dos bytes da mensagem pode ser encontrado em Mensagens MIDI .

Depois de receber uma 'nota ativada' ou 'anotação desativada' para uma determinada tecla do teclado, você pode mapeá-la para uma tecla que desejar, atribuindo-lhe uma constante da classe KeyEvent, algo como C # 4 -> KeyEvent.VK_A e assim por diante . Esse código de chave pode ser usado pelos java.awt.Robotmétodos keyPress e keyRelease para realmente enviar o pressionamento de tecla para o sistema operacional e, portanto, para outros aplicativos.

dronus
fonte
4

Concordo com a resposta de Brian O'Dell - se esse fosse o meu projeto, eu o faria em hardware. Tem a vantagem de ser independente de plataforma e hardware - sua caixa substitui a necessidade de uma interface MIDI-USB e uma API de PC.

O mbed é uma plataforma de prototipagem rápida, fácil de aprender e com múltiplas vantagens sobre o Arduino IMHO (compilador on-line, flash de 512 KB, 96 MHz, linguagem C ++). Possui uma interface de teclado USB e uma interface USB Midi pré-escrita para você.

A comunidade é muito amigável e está disposta a ajudar, e há muitos projetos existentes usando emulação escondida MIDI e USB - pesquise no YouTube por "mbed MIDI" ou similar.

Alex L
fonte
4

Se você usa Linux, dê uma olhada no Footware .

Deve ser exatamente o que você está procurando - se você ajustar os tons MIDI para um mapeamento de teclas do seu gosto ...

Eu nunca pensei que isso poderia ser útil para ninguém além de mim; o)

FlashKorten
fonte
2
No meu trabalho anterior como um administrador Eu tinha um pé-controlador sob minha mesa - para minimizar a sair de casa-linha no vim
FlashKorten
2

Tente usar um sistema baseado em microcontrolador, como o Arduino .

Peter Mortensen
fonte
1

Isso não seria muito difícil.

Suponho que você esteja no Windows , embora não tenha certeza disso. Eu escrevi um seqüenciador MIDI , http://pianocheetah.com , em C ++ antigo e permite que você use o teclado do piano para executar comandos. Não há motivo para que você não possa fazer o mesmo para pressionar as teclas no fluxo de entrada do teclado.

Mas vamos lá agora. Você se lembra de quanto tempo você aprendeu o teclado, certo? Você está disposto a passar por isso de novo? E você está disposto a poluir seu abençoado teclado com um monte de símbolos de teclas estúpidas por todo o lado?

Você precisará usar pelo menos 26 teclas alfabéticas, 10 numéricas, 11 de pontuação e pelo menos 12 teclas de função E seus estados alterados. Portanto, são 60 chaves mais estados alterados. Isso queimará 5 oitavas de teclas. Você estará fazendo "pulos" de piano = todo = o tempo. Diga adeus ao toque em digitação.

Você pode se salvar do RSI , mas criou outro tipo de pesadelo para si mesmo.

E boa sorte em conseguir que seu chefe compre um teclado MIDI para você no trabalho.

Se você aprendeu a tocar piano de verdade, aprendeu a tocar sem estresse. Faça isso no teclado QWERTY . Sem tensão. Comece devagar.

Stephen Hazel
fonte
Obrigado pelas amáveis ​​palavras, mas trabalhei muito nessa coisa e não pretendo torná-la de código aberto - desculpe. Mas o que você faria é usar midiInOpen (); forneça um retorno de chamada para processar a entrada midi; ignore tudo, exceto os eventos conhecidos, mapeie a nota midi para alguma tecla do teclado e insira-a no fluxo de entrada do teclado (eu esqueço a API para isso, mas tenho bastante certeza de que existe uma, pelo menos).
Stephen Hazel