Forum: Analoge Elektronik und Schaltungstechnik Klaviatur abtasten


von Sven K. (satirebird)


Angehängte Dateien:

Lesenswert?

Ich habe hier das Innenleben eines relativ teuren Digital-Pianos. Es 
besteht aus der Tastenmechanik und Platinen zum auslesen der 
Tastenanschläge. Ich habe die Schaltung soweit entschlüsselt. Siehe 
Bild.

Die Platinen sitzen über der Tastenmechanik. Dazwischen sitzt eine 
Gummimatte mit einer leitenden Schicht. Das Prinzip ist genau so wie bei 
einer IR-Fernbedienung. Die Tasten schlagen von unten gegen das Gummi 
und erzeugen so einen messbaren Kontakt.

Jetzt hat JEDE der 88 Tasten 3 Kontakte über die "irgendwie" die 
Anschlaggeschwindigkeit gemessen wird. Drückt man die Klaviertaste 
langsam durch werden die Kontakte auch nacheinander ausgelöst. Drückt 
man z.B. Key1 aus der Schaltung wird zuerst SW1 aktiv, dann SW2 und 
zuletzt SW3.
Um Kabel zu sparen (was durchaus sinnvoll ist, bei der Menge an 
Kontakten) "hängen" immer 4 Tasten zusammen an einer Leitung. Ich habe 
nur 4 Tasten gezeichnet. Der Rest wiederholt sich praktisch nur noch (22 
mal). V1 bis V3 und G1 bis G4 gehen gleichermaßen an alle anderen Blöcke 
/ Transistoren.

4 Tasten (12 Kontakte) müssen also immer gescannt werden. Wenn man so 
eine Klaviertaste anschlägt geht das schon recht schnell. Der zeitliche 
Differenz bis alle drei Kontakte aktiv sind dürften nur einige ms 
betragen.

Nach der langen Vorrede hier meine eigentliche Frage. Wie würdet ihr die 
Transistoren ansteuern um die Anschlaggeschwindigkeit möglichst exakt zu 
messen? Welche Spannungen, Frequenzen und welche Abtastlogik wären 
sinnvoll? Beim Original kann ich leider nicht mehr Nachmessen.

Nachtrag:
Theoretisch würden auch zwei Kontakte pro Taste ausreichen um die 
Anschlaggeschwindigkeit zu messen. Warum hier 3 Kontakte verwendet 
wurden kann ich mir auch nicht erklären. Hat jemand eine Idee?

von MaWin (Gast)


Lesenswert?

Es reicht, zunächst nur SW1 von allen 4 Tasten parallel zu erfassen (das 
wird man aber im Multiplex mit den 21 anderen Tastenblöcken machen). 
Wenn das Keyboard mit MIDI ausgestattet ist, ergibt sich sowieso eine 
eher langsame Samplefrequenz, 100us Abtastzeit pro Tastengruppe ergibt 
2.2ms, sollte reichen.
Erst wenn eine Taste SW1 gedrückt wurde, müssen SW2 und SW3 mit erfasst 
werden. Bei 10us Multiplexrate sollte aber auch dauernde Miterfassung 
kein Problem sein, 0.66ms für alle.

von Gerald K. (geku)


Lesenswert?

Sven K. schrieb:
> Warum hier 3 Kontakte verwendet wurden kann ich mir auch nicht erklären.
> Hat jemand eine Idee?

Vielleicht will man die Beschleunigung messen. Beschleunigung ist die 
Änderung von zwei Geschwindigkeitsmessungen. Drei Tasten ermöglichen 
zwei Messungen.

Sven K. schrieb:
> Theoretisch würden auch zwei Kontakte pro Taste ausreichen um die
> Anschlaggeschwindigkeit zu messen

Theoretisch müsste ein Taste reichen indem man den Widerstand misst. 
Durch das Zusammendrücken des Tastengummis müsste der Widerstand kleiner 
werden.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerald K. schrieb:
> Theoretisch müsste ein Taste reichen indem man den Widerstand misst.
> Durch das Zusammendrücken des Tastengummis müsste der Widerstand kleiner
> werden.

Da hast du aber nur die Anschlagskraft, nicht -geschwindigkeit.

Außerdem schwankt wahrscheinlich der Widerstandswert insgesamt zu stark, 
als dass das ein sinnvolles Maß ist.

Ansonsten wird deine Variante, dass man nicht nur Geschwindigkeit 
sondern auch Beschleunigung erfassen kann, schon hinkommen. Die 
Anschlagdynamik so eines e-Pianos unterscheidet sich schon von dem 
einfacher Keyboards (die vermutlich wirklich nur die Kraft messen).

von Gerald K. (geku)


Lesenswert?

Jörg W. schrieb:
> Da hast du aber nur die Anschlagskraft, nicht -geschwindigkeit.

Die Beschleunigung ist proportional zur Kraft.

Jörg W. schrieb:
> Außerdem schwankt wahrscheinlich der Widerstandswert insgesamt zu stark,
> als dass das ein sinnvolles Maß ist.

Die Frage ist anderseits wie genau die Werte sein müssen um den Zweck zu 
erfüllen.
Es ist auch bei einem realen Klavier schwierig über alle Tasten den 
gleichen Anschlag zu erzielen.

Die Frage ist welchen Einfluß das Feedback zwischen Anschlagmotorik und 
Klangempfinden besteht. Der Klavierspieler kann sich mit der Zeit darauf 
einstellen.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gerald K. schrieb:
> Die Beschleunigung ist proportional zur Kraft.

Der Gummi misst aber die Bremskraft, nicht die Beschleunigungskraft. OK, 
die hängt von der Geschwindigkeit ab (insofern war meine obige Aussage 
falsch), aber die Beschleunigung selbst kannst du so nicht messen.

Klar kann ein guter Pianist auch mit einem simplen Keyboard gut spielen, 
aber das Anschlagsgefühl auf einem ordentlichen e-Piano ist schon ein 
anderes. Da spielt aber nicht nur die Elektronik eine Rolle, sondern 
auch die mechanische Gestaltung (Nachbildung realer Klaviertasten, bei 
denen man eine größere Masse über Hebel beschleunigt).

von Gerald K. (geku)


Lesenswert?

Die Lösung mit drei Kontakte ist sicher einfacher zu realisieren.

von A. S. (Gast)


Lesenswert?

Sven K. schrieb:
> Warum hier 3 Kontakte verwendet wurden kann ich mir auch nicht erklären.
> Hat jemand eine Idee?

Nur die Geschwindigkeit ist relevant, sie ist das Ergebnis (Integral) 
einer beliebigen Beschleunigung des Hammers. Dafür reichen SW 2 und 3.

SW 1 könnte dann dafür sein, wie lange die Taste gedrückt ist/Nachhall. 
Beim Klavier hat das ja auch einen "eigenen Druckpunkt".

von Sven K. (satirebird)


Lesenswert?

A. S. schrieb:
> SW 1 könnte dann dafür sein, wie lange die Taste gedrückt ist/Nachhall.
> Beim Klavier hat das ja auch einen "eigenen Druckpunkt".

Das ist ein guter Hinweis. Es könnte tatsächlich der Punkt sein, bei dem 
bei einem echten Klavier der Dämpfer von der Saite genommen bzw. wieder 
aufgesetzt wird. SW1 müsste also hauptsächlich beim Loslassen 
berücksichtigt werden.
Mit SW2/SW3 wird dann die Geschwindigkeit gemessen.

von Christian Erker (Gast)


Lesenswert?

Die drei Kontakte sind eher dazu da, um die Repetitionsmechanik eines 
echten (besseren) Flügels zu emulieren. Bei dem muss man die Taste nicht 
ganz loslassen (und damit auch die Dämpfer auf die Saite senken) um die 
Mechanik zu "resetten" und nochmal anschlagen zu können.

3 Kontakte damit man auch von der "Mittelstellung" noch die 
Geschwindigkeit messen kann.

Gruß,
Christian

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Sven K. schrieb:
> Warum hier 3 Kontakte verwendet
> wurden kann ich mir auch nicht erklären. Hat jemand eine Idee?

Ist für das Loslassen der Taste wichtig. Mit dem Mittelkontakt wird der 
virtuelle Dämpfer bedient.

von Sebastian S. (amateur)


Lesenswert?

Ich rate mal, dass das dahinterstehende Prinzip folgendes ist:
Schlägt (in diesem Falle) der Taster auf das Gummi, so wird der 
Hauptimpuls für die Erfassung ausgelöst. Die anderen zwei Taster werden 
wohl so angeordnet sein, dass sie minimal später "aufschlagen". Aus 
diesen Zeiten kann man wohl ermitteln, wie stark angeschlagen wurde. Im 
Extremfall wird wahrscheinlich nur der erste oder höchstens der zweite 
Taster aktiv. Soll die Nachbarn schonen.
oder auch nicht.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Sven K. schrieb:
> Jetzt hat JEDE der 88 Tasten 3 Kontakte über die "irgendwie" die
> Anschlaggeschwindigkeit gemessen wird.

Normalerweise bei 3 Punkt-Kontakten wird tatsächlich eine 
Anäherungslogik damit bedient.
Bedeutet:
SW1-SW2 = Anschlagzeit
SW2-SW3 = Aufschlaghärte

Häufig werden da DSP's von DREAM verwendet.
In der Scannrutine werden für alle 88 Tasten "Register" definiert, wo 
dann diese werte Abgelegt werden.
Nach jedem Scanndurchgang wird Letzter Scan mit dem Nächsten Scann 
verglichen, und so dann ein "Ton" daraus generiert.

Ist jetzt sehr stark vereinfacht, aber bei DREAM gibt es fertige "Tools" 
zum Download um das zu Berechnen.
Es gibt aber auch Varianten wo SW3 als Aftertouch verwendet wird, bei 
Pianos aber eher selten ;-)
PS Wir stellen Pianos her die genau so funktionieren, allerdings 
verwenden wir kein DREAM Chips mehr sondern haben da mittlerweile PGA's 
oder MCU's dazu ;-)

: Bearbeitet durch User
von Mucky F. (Gast)


Lesenswert?

Sven K. schrieb:
> 4 Tasten (12 Kontakte) müssen also immer gescannt werden. Wenn man so eine
> Klaviertaste anschlägt geht das schon recht schnell. Der zeitliche
> Differenz bis alle drei Kontakte aktiv sind dürften nur einige ms
> betragen.

Warum? Ist es nicht einfacher erst alle anzusteuern und dann zu prüfen 
welche S1 gedrückt wurde? Das Prinzip ist Open Collector  da bietet sich 
das an.

Der Mensch hat auch nur 10 Finger mit begrenzter Reichweite und kann 
nicht alle gleichzeitig drücken. Daher muss man entferne Gruppen auch 
nicht prüfen (Ausnahmen kann man später machen).

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Mucky F. schrieb:
> Warum? Ist es nicht einfacher erst alle anzusteuern und dann zu prüfen
> welche S1 gedrückt wurde? Das Prinzip ist Open Collector  da bietet sich
> das an.

Es ist Einfacher Permanent alles zu Scannen, und bei Kontakt ein 
Register zu setzen das die Zeit zählt als den Scannforgang zu 
Unterbrechen wenn ein Kontakt geschlossen ist. Da müsstest du ja 
jedesmal einen Interrupt aufrufen und in ein Unterprogramm springen ?!?

Sehr Häufig wird auch die Scannleitungen für bspw. LED Mitverwendet, so 
dass der Scann immer gleichbleibend ist und die LED's nicht bei 
gedrückten Tasten anfangen zu Flimmern...

von A. S. (Gast)


Lesenswert?

Patrick L. schrieb:
> SW1-SW2 = Anschlagzeit
> SW2-SW3 = Aufschlaghärte

Was wäre denn die Entsprechung bei einem echten Piano? Was ist 
Anschlagzeit?

von Sven K. (satirebird)


Lesenswert?

Patrick L. schrieb:
> Häufig werden da DSP's von DREAM verwendet.
> In der Scannrutine werden für alle 88 Tasten "Register" definiert, wo
> dann diese werte Abgelegt werden.
> Nach jedem Scanndurchgang wird Letzter Scan mit dem Nächsten Scann
> verglichen, und so dann ein "Ton" daraus generiert.
>
> Ist jetzt sehr stark vereinfacht, aber bei DREAM gibt es fertige "Tools"
> zum Download um das zu Berechnen.

Das ist sehr interessant. Was mich dazu noch interessiert: Mit welchen 
Frequenzen werden denn die Tasten abgescannt?

von Mucky F. (Gast)


Lesenswert?

Patrick L. schrieb:
> Es ist Einfacher Permanent alles zu Scannen, und bei Kontakt ein
> Register zu setzen das die Zeit zählt als den Scannforgang zu
> Unterbrechen wenn ein Kontakt geschlossen ist
Hab das nur überflogen aber evtl. wird bei dieser Schaltung nicht 
gescannt, könnte der Sinn dieser Anordnung sein. Bei diesen langen 
Leitungen und der hohen Anzahl von Tasten hast du sonst Probleme mit der 
Abstrahlung.

von Mucky F. (Gast)


Lesenswert?

A. S. schrieb:
> Was wäre denn die Entsprechung bei einem echten Piano? Was ist
> Anschlagzeit?

Damit wird indirekt die Anschlaghärte gemessen. Diese wiederum 
beeinflusst die Lautstärke. Der dritte Taster ist für das Dämpfung der 
Seiten.  Wenn der Pianomann die Taste unten hält.

von Gerhard Z. (germel)


Lesenswert?

Patrick L. schrieb:
> Normalerweise bei 3 Punkt-Kontakten wird tatsächlich eine
> Anäherungslogik damit bedient.
> Bedeutet:
> SW1-SW2 = Anschlagzeit
> SW2-SW3 = Aufschlaghärte

Bin jetzt auch verwirrt was hier was ist. Im Englischen wird die 
Anschlagstärke als Velocity bezwichnet. Das ist auch die richtige 
Charakterisierung. Die Geschwindigkeit, mit der der Hammer aus die Saite 
trifft bestimmt die Lautstärke und damit gleichzeitig den Klang.

Was soll jetzt die Anschlagszeit im Gegensatz dazu sein wenn die 
Velocity mit den Kontakten 2 und 3 gemessen wird? Die Velocity könnte 
man genauso zwischen SW1 und SW2 messen.

Christian Erker schrieb:
> Die drei Kontakte sind eher dazu da, um die Repetitionsmechanik eines
> echten (besseren) Flügels zu emulieren. Bei dem muss man die Taste nicht
> ganz loslassen (und damit auch die Dämpfer auf die Saite senken) um die
> Mechanik zu "resetten" und nochmal anschlagen zu können.
>
> 3 Kontakte damit man auch von der "Mittelstellung" noch die
> Geschwindigkeit messen kann.

So kommt's hin. Solange SW1 gedrückt ist wird der Dämpfer nicht 
abgesenkt (der Ton also nicht bedämpft) und man kann einen weiteren 
Anschlag mit SW2, SW3 messen.
Danke

von Idee (Gast)


Lesenswert?

Gerhard Z. schrieb:
>> SW1-SW2 = Anschlagzeit
>> SW2-SW3 = Aufschlaghärte
>
> Bin jetzt auch verwirrt was hier was ist.
Braucht es zur Betätigung der Schalter eventuell unterschiedliche 
Kräfte?

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Angehängte Dateien:

Lesenswert?

Sven K. schrieb:
> Das ist sehr interessant. Was mich dazu noch interessiert: Mit welchen
> Frequenzen werden denn die Tasten abgescannt?

200kHz hat aber damit zu tun dass man die LEDs nicht Flimmern sieht
Die Routine ist Timer gesteuert, das die Optische so wie auch die Zeit 
zwischen den SW1~SW3 konstant ist.

Zur Gedankenstütze mal Auszüge aus den Scann-Routinen:
1
SetupOsc    bic.b   #OFIFG,&IFG1            ; Clear OSC fault flag
2
            mov.b   #RSEL0,&BCSCTL1          ; Set to 5MHz XTAL+XTS
3
            mov.w   #0FFh,R15               ; R15 = Delay
4
SetupOsc1   dec.w   R15                     ; Additional delay to ensure start
5
            jnz     SetupOsc1               ;
6
            bit.b   #OFIFG,&IFG1            ; OSC fault flag set?
7
            jnz     SetupOsc                ; OSC Fault, clear flag again
8
            bis.b   #SELM_2+SELS,&BCSCTL2   ; MCLK= LFXT2/SCLK= LFXT2
9
.
10
.
11
            ; Timer A3 200KHz Devinitions **************************************
12
;   As coded with TACLK= HF XTAL = 5MHz, I²C toggle rates are:
13
;   CCR0 = 5MHz/(25) = 200kHz one Clockphase
14
            clr.w   &TAR                    ; Reset Timer A3
15
            mov.w   #Bitime,&TACCR0         ; Set 10uS Clocktime
16
            mov.w   #Bitime_5,&TACCR1       ; set 5us Clokphasetime
17
            mov.w   #Bitime_5,&TACCR2      // set 2nd Clockphase of Headbus_R   CHANGE V1.9c!
18
SetupC0     mov.w   #OUTMOD_4,&TACCTL0 ; CCR0 toggle, interrupt enabled+CCIE
19
SetupC1     mov.w   #OUTMOD_0+OUT+CCIE,&TACCTL1   ; CCR1 SET, interrupt enabled
20
SetupTA     mov.w   #TASSEL_2+MC_1,&TACTL   ; MCLK, contmode, interrupt+TAIE+MC_1
21
/**/
22
            ; Startup of Scanregister Devinitions ******************************
23
SYSinit     bis.b   #PK_SCL,&P2DIR           ; Set to output, SCL = 0 
24
            bis.b   #PK_SCL,&P2OUT           ; Set to input, SDA = 1 due to pull-up
25
            mov.b   #008h,BitCnt             ; Initial [R12] Display Scanadress
26
            mov.b   #11111110b,&ScnPos       ; Initial Scanposition (Invert)
27
FillLoop    mov.b   #000h,ALROW0-1(BitCnt)   ; (F0)Set SW1 Matrix Keybits 
28
            mov.b   #000h,ILROW0-1(BitCnt)   ; (F0)Set SW2 Matrix Keybits
29
            mov.b   #000h,PLROW0-1(BitCnt)   ; (E0)Set SW3 Matrix Keybits 
30
            dec.w   BitCnt                   ;  ?  : Count down Address and test if (-)
31
            jc      FillLoop                 ; No  : Continue scan
32
            mov.b   #END_RAM-LEDmem,BitCnt   ; YES : Set [R12] with Length of Registerspace
33
.
34
.
35
SC2Loop     bit.b    #040h,&P2IN             ;  ?  : Scanline Activ? 
36
            jz       SC2Loop                 ; No  : Wait of Scanline activ
37
            bic.b    #010h,&P1DIR           //  "  : NO  : Clear the Bit        
38
SC2NoK      bit.b    #008h,&P1MEM           // YES :  ?  : KL-SCAN0 bit set?    
39
            jz       SC2NoK0                //  "  : NO  : Clear the Bit        
40
            mov.b    &P4MEM,&P4DIR          //  "  : YES : Set the Bit          
41
            mov.b    &P5MEM,&P5DIR          //  "  : YES : Set the Bit          
42
            bis.b    #008h,&P1DIR           //  "  : YES : Set the Bit          
43
SC2NoK0     bit.b    #2h,ILROW6             //  "  : YES :  ?  : Test ENHLED
44
          //bit.b    #2,&I2CFLAG            // YES :  ?  : [ffff'xkcE] "c" Flag?
45
            jz       SC2Loopnc              //  "  : NO  : Continue Scanning    
46
            push     #Key2P5                //  "  : Save next Step to Stack    
47
            br       #EXEC_MIDI             //  "  : Execute Recived Command    
48
SC2Loopnc   clr.w    RowCont                 ; YES : Initial(R5) Rowcounter (Scanline 1~7)
49
            mov.w    #01h,ScanLine           ;  "  : Initial(R8) Scanline Bitvalue
50
51
Scan2P6     mov.b    Scan2MAP+1(R5),AdrCnt   ; Set R10 with Adress of RAMBANK for Actual Scanline position
52
            bit.b    R8,&P6IN                ; Test Scanline on P6
53
            jnz      Clr2P6                  ;  ?  : If LED ON? 
54
Set2P6      bis.b    Scan2MAP(R5),LEDmem(R10); YES : Set Bit in RAM
55
            jmp      Nxt2P6                  ;  "  : and Continue Scan
56
Clr2P6      bic.b    Scan2MAP(R5),LEDmem(R10); NO  : Reset Bit in RAM
57
            
58
Nxt2P6      incd.b   RowCont                 ; Count up Rowcounter(R5) by 2 for next MAP Adress
59
            rlc.b    ScanLine                ;  ?  : Set next Scanline(R8) and Test 1st 8 Line scanned
60
            jnc      Scan2P6                 ; NO  : go next Scanline
61
            mov.b    #10h,ScanLine           ; YES : Scann next 4 Bit on P5

Idee schrieb:
> Braucht es zur Betätigung der Schalter eventuell unterschiedliche
> Kräfte?

Kann man so sagen stimmt aber nicht 100%, teilweise ist es tatsächlich 
so das der SW3 etwas mehr Kraft braucht um zu reagieren, ist aber 
Unterschiedlich ob er eine "Aftertouch" Funktion hat oder eben den Druck 
des Hammers auf der Virtuellen Seite emulieren soll.
Das Bild zeigt das Schema im Auszug von Controller mit denen wir E-Piano 
und Orgeln nachträglich mit MIDI ausrüsten. Dort wird der Scan mit dem 
Scan des Instruments Synchronisiert und liegt je nach Gerät zwischen 
50kHz~500kHz

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Mucky F. schrieb:
> Damit wird indirekt die Anschlaghärte gemessen. Diese wiederum
> beeinflusst die Lautstärke. Der dritte Taster ist für das Dämpfung der
> Seiten.  Wenn der Pianomann die Taste unten hält.

Du hast die Posts ja nicht gelesen. Wenn, dann muss, wie beschrieben, 
der erste Schalter die Dämpfung machen, da er als letzter geöffnet wird.

Außerdem ging es um die Frage, worin der Unterschied zwischen 
"Anschlagzeit" und "Anschlaghärte" liegen soll, da beides Synonym ist. 
Die "Härte" kann nur über die Zeitdifferenz zweier Schalter gemessen 
werden.

von A. S. (Gast)


Lesenswert?

Patrick L. schrieb:
> 200kHz hat aber damit zu tun dass man die LEDs nicht Flimmern sieht
> Die Routine ist Timer gesteuert, das die Optische so wie auch die Zeit
> zwischen den SW1~SW3 konstant ist.

Vielen Dank für die Internas.

Für die LEDs dürften auch 200Hz ausreichen. Der Hohe Takt dürfte doch 
eher die Auflösung der Anschlagstärke bestimmen: Wenn da typisch 1ms 
zwischen liegt und ich das mit 1% auflösen möchte, dann brauche ich halt 
200kHz.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Angehängte Dateien:

Lesenswert?

A. S. schrieb:
> Vielen Dank für die Internas.

Gerne Geschehen man versucht ja am Verstehen zu Helfen

A. S. schrieb:
> Für die LEDs dürften auch 200Hz ausreichen.

Ja das ist Richtig wenn sie Konstant sind Bei gewissen E-Pianos marke 
China sind es sogar oft 100 Hz. oder weniger auch gibt es Tatsächlich 
welche die es Per Interrupt abfragen wo man dann ganz deutlich der 
Anzeige ansieht wenn mehrere Tasten zeitgleich angeschlagen werden.

Das

A. S. schrieb:
> dass man die LEDs nicht Flimmern sieht

ist auch eher auf den Umstand des Timer Aufrufs gemeint. wobei selbst 
bei 200kHz sieht man wenn ein Interrupt plötzlich das LED so 30 Cyclen 
lang leuchten lässt bis der IRQ abgearbeitet wurde.

Da die MIDI Daten in der Regel Velocity 0~255 [00~FF] übertragen hat 
sich da meistens die 200kHz durchgesetzt was für den @TO interessant 
sein dürfte.

A. S. schrieb:
> Wenn da typisch 1ms
> zwischen liegt und ich das mit 1% auflösen möchte,

Hast du ganz schön erklärt wobei die Zeit von SW2 und SW3 meistens nur 
noch mit 0~127 aufgelöst wird. Das hängt dann wieder vom verwendeten 
MIDI Format ab :-)

A. S. schrieb:
> Die "Härte" kann nur über die Zeitdifferenz zweier Schalter gemessen
> werden.

Auch das ist ganz schön erklärt.
Die Geschwindigkeit ist das eine was hauptsächlich die Ton Lautstärke 
beim Piano ändert, die "Härte" macht aber Tatsächlich eine Klangänderung 
aus.
Es gibt E-Pianos die mit Hall-Elemente Messen, wobei die dan meist auch 
richtige Hammermechanik haben und es gibt auch welche die mittels Piezo 
messen aber das ist dann eine andere Liga.

Was für den TO auch interessant sein dürfte ist die Lösung wie man aus 
einem Bestehenden Scannprint das schon verbaut ist via MIDI eine Taste 
drückt, dazu angehängte Schema der Keymatrix einer Oktave.

: Bearbeitet durch User
von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Angehängte Dateien:

Lesenswert?

Um sich 3x88 Optokoppler zu Sparen, gehört dan die Blockmatrix dazu
Siehe Schema.

Wichtig ist natürlich dass das ganze Scansynchron läuft, weshalb man 
sich mit dem vorhandenen Scann synchronisieren muß.

von Justin S. (Gast)


Lesenswert?

Das Ganze ist komplizierter als man denkt:

Aus dem Zeitintervall, das typischerweise zwischen 2ms und 80ms (je nach 
Anschlaghärte) liegt, muss, wenn das Signal über MIDI gesendet werden 
soll, eine von 127 Velocity-Werten ermittelt werden. Das könnte man mit 
Tabelle machen, aber man wird feststellen, dass man eine zeitliche 
Auflösung von deutlich unter 100µs braucht, um auch verschiedene sehr 
laute Anschläge noch gut aufzulösen.

Sprich, man braucht mindestens einen 16-Bit-Timer und damit eine 64kByte 
große Tabelle. Ich habe das Ganze also ohne Tabelle realisiert auf einem 
Arduino mit 16MHz in Assembler. Ich habs nur mit größten 
Optimierungsanstrengungen hinbekommen.

Und das war nur für zwei Kontakte. Für drei Kontakte braucht man 
definitiv eine viel leistungsfähigere CPU und will eigentlich auch kein 
MIDI mit seiner Reduktion auf 127 Velocity-Werte dazwischen haben, 
sondern die Tongeneratoren direkt ansteuern mit z.B. 1000 
Velocity-Werten (mehr werden auch genutzt, sind aber weder vom Spieler 
noch vom Zuhörer zu unterscheiden).

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Justin S. schrieb:
> und damit eine 64kByte
> große Tabelle.

Nein die tabelle kanst du dir sparen, da reicht eine Calculation, da der 
Timer ja sehr konstant arbeitet ist die zeit "T" aucch sehr direkt mit 
einer einfachen Calculation machbar.
Dazu hat der MSP430F145 eine MPY32 integriert, damit lässt sich das in 
Realtime berechnen ;-)

Gut es sagt niemand dass es Einfach ist, aber halt machber. und ja alles 
im purem Assembler programmiert damit auch zuverlässig jedes Timing 
funktioniert.
1
            ; Flotingpoint MPY use ACC32
2
GO_FP_MPY   mov.w   R4,&0130h           ; Load first operand (XXxx)
3
            mov.w   R8,&0138h           ; Load 2nd operand   (YYyy)
4
            mov.w   &13Ah,&Sum0         ; Save the Loword of MPY
5
            mov.w   &13Ch,&Sum1         ; Save the Hiword of MPY
6
            bit.b   #80h,R6             ;  ? : Floatingpoint MPY?
7
            jz      FPU_EXIT            ; NO : Inteeger no EXP Byte used
8
            tst.b   R10                 ; EXP Used?
9
            jz      FPU_EXIT            ; NO : Inteeger no EXP Byte used
10
            call    #EXP_MINUS          ; Set the Exponent
11
GO_INT_MPY            
12
            jmp     FPU_EXIT
13
            
14
go_div      bit.b   #80h,R6             ;  ? : Floatingpoint MPY?
15
            jz      go_div_INT          ; NO : Inteeger no EXP Byte used
16
            tst.b   R10                 ; EXP Used?
17
            jnz     go_div_EXP          ; NO : Inteeger no EXP Byte used
18
            inc.b   R10
19
go_div_EXP  mov.w   R4,&0130h           ; Load first operand xx
20
            mov.w   R10,&0138h          ; Load 2nd operand
21
            mov.w   &13Ah,&Sum0         ; Save the Loword of MPY
22
            mov.w   &13Ch,&Sum1         ; Save the Hiword of MPY
23
go_div_INT  push.w  &Sum1               ; Highword of ACC32
24
            push.w  &Sum0               ; Lowword of ACC32
25
            push.w  R8                  ; Exponent
26
            call    #DIVIDE
27
            pop.w   &Sum0               ; geht the Real value  
28
            
29
            jmp     FPU_EXIT
30
            ; Flotingpoint MPY use ACC32
31
  
32
go_mov      mov.w   R4,Sum0
33
34
35
FPU_EXIT    ; Destination (YY) Test and Write Programm

: Bearbeitet durch User
von Sven K. (satirebird)


Lesenswert?

Patrick L. schrieb:
> Gut es sagt niemand dass es Einfach ist, aber halt machber. und ja alles
> im purem Assembler programmiert damit auch zuverlässig jedes Timing
> funktioniert.

Hab schon lange keinen von Hand geschriebenen Assembler mehr gesehen. 
Aber bei 200kHz muss man schon aufpassen, dass dort nichts dazwischen 
"funkt".

> Was für den TO auch interessant sein dürfte ist die Lösung wie man aus
> einem Bestehenden Scannprint das schon verbaut ist via MIDI eine Taste
> drückt, dazu angehängte Schema der Keymatrix einer Oktave.

Nein. Ich habe das Keyboard-Modul ohne Gehäuse aus einer Reparatur 
überlassen bekommen. Die Tasten haben eine echte Hammermechanik. Ich 
möchte praktisch einen kleine MIDI-Controller dazu bauen um das Teil am 
PC verwenden zu können.

So wie ich das gesehen habe, ist die 3x4 Matrix, wie ich sie hier habe, 
nicht so üblich.

Ich würde jetzt naiv bei der Matrixansteuerung so vorgehen:
1. V1=1
2. G1 bis G4 der Reihe nach auf Masse legen
3. Key01-04 bis Key85-88 jedes mal einlesen.

Das ganze jeweils auch für V2=1 und V3=1

Eventuell müsste man die Leitungen Key01-04 bis Key85-88 durch einen 
kurzen Impuls wieder auf 1 zurücksetzen.

Schaltung und Mikrocontroller dazu muss ich mir noch überlegen.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Sven K. schrieb:
> So wie ich das gesehen habe, ist die 3x4 Matrix, wie ich sie hier habe,
> nicht so üblich.

Das dürfte für die Scanlogic nicht Problematisch werden, da die Row und 
Colum anhand einer Tabelle in der Scanlogic verarbeitet werden.
Dis haben wir so gelöst um möglichst Flexibel auf jedes Mögliche 
Keyboard/Orgel/Oder E-Piano ohne grössere Softwareanpassung eingehen zu 
können.
1
;  Byte     |    FE     |    FD     |    FB     |    F7     |    EF     |    DF     |    BF     |    7F     |
2
;  Scanline |     1     |     2     |     3     |     4     |     5     |     6     |     7     |     8     |
3
;           |   P4.0(01)|   P4.1(02)|   P4.2(04)|   P4.3(08)|   P4.4(10)|   P4.5(20)|   P4.6(40)|   P4.7(80)|
4
; ScanSwitch|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|SW1 SW2 SW3|
5
;$4110      |BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|BIT,BIT,BIT|
6
;  $41   $10|   "C0"    |  "C#0"    |   "D0"    |   "D#0"   |   "E0"    |   "F0"    |  "F#0"    |   "G0"    |
7
LD0000    DB 04h,01h,00h,04h,01h,01h,04h,01h,02h,04h,01h,03h,04h,01h,04h,04h,01h,05h,04h,01h,06h,04h,01h,07h
8
;  $41   $20|   "G#0"   |   "A0"    |  "A#0"    |   "H0"    |   "C1"    |  "C#1"    |   "D1"    |   "D#1"   |
9
LD0018    DB 00h,02h,00h,00h,02h,01h,08h,02h,02h,00h,02h,03h,00h,02h,04h,00h,02h,05h,00h,02h,06h,00h,00h,00h
10
;  $41   $30|   "E1"    |   "F1"    |  "F#1"    |   "G1"    |   "G#1"   |   "A1"    |  "A#1"    |   "H1"    |
11
LD0030    DB 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
12
;  $41   $40|   "C2"    |  "C#2"    |   "D2"    |   "D#2"   |   "E2"    |   "F2"    |  "F#2"    |   "G2"    |
13
LD0048    DB 00h,10h,11h,00h,10h,12h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
14
;  $41   $50|   "G#2"   |   "A2"    |  "A#2"    |   "H2"    |   "C3"    |  "C#3"    |   "D3"    |   "D#3"   |
15
LD0060    DB 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
16
;  $43   $10|   "E3"    |   "F3"    |  "F#3"    |   "G3"    |   "G#3"   |   "A3"    |  "A#3"    |   "H3"    |
17
LD0078    DB 00h,01h,08h,00h,01h,09h,00h,01h,0Ah,00h,01h,0Bh,00h,01h,0Ch,00h,01h,0Dh,00h,01h,0Eh,00h,01h,0Fh
18
;  $43   $20|   "C4"    |  "C#4"    |   "D4"    |   "D#4"   |   "E4"    |   "F4"    |  "F#4"    |   "G4"    |
19
LD0090    DB 00h,02h,08h,00h,02h,09h,00h,02h,0Ah,00h,02h,0Bh,00h,02h,0Ch,00h,02h,0Dh,00h,02h,0Eh,00h,02h,0Fh
20
;  $43   $30|   "G#4"   |   "A4"    |  "A#4"    |   "H4"    |   "C5"    |  "C#5"    |   "D5"    |   "D#5"   |
21
LD00A8    DB 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
22
;  $43   $40|   "E5"    |   "F5"    |  "F#5"    |   "G5"    |   "G#5"   |   "A5"    |  "A#5"    |   "H5"    |
23
LD00C0    DB 00h,04h,08h,00h,04h,09h,00h,04h,0Ah,00h,04h,0Bh,00h,04h,0Ch,00h,04h,0Dh,00h,04h,0Eh,00h,04h,0Fh
Achtung Tabelle wird überlappt dargestellt da zu wenig zeichen im 
Fenster möglich sind

: Bearbeitet durch User
von xyz (Gast)


Lesenswert?

Das Thema "Klaviatur abtasten" wurde hier im Forum ja schon
mehr durchgekaut.
Wenn man nicht in der Verkabelung ersticken will, bleiben da
eigentlich immer nur Schieberegister. Die kann man einfach
kaskadieren und genauso einfach per SPI einlesen.
Mit einer Matrixansteuerung vermindert man den Leitungsaufwand
nicht, sondern steigert ihn nur weiter.
Und ob die Kontakte sich in einer Matrix betreiben lassen,
sollte man zumindest auch vorher genaustens geprueft haben.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

xyz schrieb:
> Mit einer Matrixansteuerung vermindert man den Leitungsaufwand
> nicht, sondern steigert ihn nur weiter.
> Und ob die Kontakte sich in einer Matrix betreiben lassen,
> sollte man zumindest auch vorher genaustens geprueft haben

Meistens werden die Matrixen bei bestehenden Keys ja bereits 
vordecodiert,
Das heißt hier im Fall vom TO mit Transistoren, oder häufig auch mit 
Dioden. da reduziert sich der Kabelaufwand schon beachtlich.
Auf den Schemas wären das CN11 und auf dem anderen CN19.
Wen wir eigene Keys bauen ist das meistens über 1MHz I²C Bus gelöst. 
dann hat man natürlich kaum mehr Kabel.

Wie Gesagt wenn das Keyboard Vorgegeben ist wie hier beim TO, dan muß 
man die Steuerung auch entsprechend Gestalten. Aus diesem Grund sind 
unsere Key to MIDI Controller so gestaltet dass sie auch beides 
offerieren also Matrix oder I²C (PF_SDA und PF_SCL auf dem Kontroller)

Genau so stellt der MIDI to Key Controller auch immer 2 Analogports für 
Beender oder ähnliches zur Verfügung CN1 (JOG_A und JOG_B).
Ausgangseitig wird dies dan mit einem schnellen Digitalpoti gelöst 
(links oben auf dem Schema der Hauptplatiene)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.