Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.

Autor Téma: ako znefunkcnit usb klavesnicu  (Přečteno 1922 krát)

trimetylamin

  • Návštěvník
  • *
  • Příspěvků: 2
  • Karma: +0/-0
    • Zobrazit profil
ako znefunkcnit usb klavesnicu
« kdy: 25 Červen 2008, 13:44:48 »
napísal som jednoduchý skript, ktorý číta údaje zo zariadenia klávesnice (napr /dev/input/event3) a podľa nich vytvára MIDI signály (noteon, noteoff, program change). tento prístup som zvolil preto, lebo nič lepšie som nevedel vymyslieť a potreboval som, aby program dokázal snímať jednak stlačenie a jednak uvoľnenie klávesu.

problém je, že samozrejme na klávesnici sa dá naďalej písať...

potreboval by som nejakú metódu ako spraviť to, aby sa na nej nedalo písať, ale aby bola prístupná pre môj program.

skúšal som zakázať čítanie zo súboru pre každého užívateľa, ale aj tak sa na nej dá ďalej písať..
moje vedomosti z komunikácie systému s klávesnicou nie sú takmer žiadne.

ešte dodám, že základná doska má podporu usb klávesnice vypnutú v biose.

za podnetné príspevky ďakujem


keby to niekoho zaujímalo, skript je tuto.
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import string

klavesy =   range(2,14) +range(16,27)
ton_offset=38
velocity=127
channel=2
prgchg=60
lsb=0
klavesnica_device = "/dev/input/by-id/usb-0b38_USB-compliant_keyboard-event-kbd"
midi_out = "/dev/midi1"



def open_klavesnica(device_arg):
   global klavesnica
   klavesnica=open(device_arg, "rb")
   
def open_port(device_arg):
   global port
   port=open(device_arg,'w')

def close_port():
   global port
   port.close()


def note_on(channel,note,volume):
   global port
   port.write("%c%c%c" % (0x90+channel, note, volume))
   port.flush()

def midi_event(byte, *data):
   port.write("%c" %(byte+channel))
   for x in data:
      port.write("%c" %(x))      
   port.flush()


tabulka =   dict([(klavesy
  • , x + ton_offset) for x in range( len(klavesy) ) ])



try: open_klavesnica(klavesnica_device)
except IOError :
        os.system("sudo chmod a+r %s" %klavesnica_device)
   open_klavesnica(klavesnica_device)

open_port(midi_out)


midi_event(192, prgchg)
midi_event(176, 0 ,lsb)


while True:
   try:
                s=klavesnica.read(16)
        except KeyboardInterrupt:
                break
   if s[8] == "\x01" and s[12] != "\x02":
      scancode = ord(s[10])
      vol = velocity * ord(s[12])
      nota = tabulka[scancode]
      if scancode==26 and vol != 0:
         try:
            print "zmena midi \n "            
            pc=int(raw_input(" \b program change: ").strip())
            lsb=int(raw_input("lsb: ").strip())            
         except ValueError:
            print"zadaj čísla"            
         midi_event(192, pc)
         midi_event(176, 0 ,lsb)
         
      else:
         note_on(channel, nota, vol)


######