Hallo,
Sorry voor de vage titel, maar ik kan niet echt een passende titel vinden voor dit probleem.
Ik ben sinds kort begonnen met het schrijven van een 'piano' in turbo pascal 7.
Nu gebruik ik voor de toetsaanslagen een case-of statement over de getkey-functie.
In die case-of statement zet ik de noot aan, schrijf ik de noot op het scherm, en zet ik de noot uit.
In een notendop (zonder omliggende procedures, behalve die waar het probleem zit) ziet het programma er zo uit:
Als ik nu dus een toon langer aansla dan "een bepaalde tijd" (maximale toonduur misschien?!), gaat de noot lussen maken. Dus tringggggg-trrrrrrrrrrrring.
Hoe kan ik ervoor zorgen dat er pas een nieuwe noot aangeslagen kan worden wanneer de vorige los gelaten is (en dus geen toetsen worden gedrukt)?
Ik heb al geprobeerd variabelen in te voegen die tijdens het drukken van een knop een bepaalde waarde krijgen, maar hij moet juist wél ingedrukt kunnen blijven.. de toon moet zich alleen niet herhalen.
Ook heb ik geprobeerd om een kopie van de vorige ingedrukte toets in een variabele te zetten:
Maar, omdat je soms 2 keer dezelfde toets achter elkaar wilt aanslaan, zal dit niet werken.
Heeft iemand hier een oplossing voor? Ik heb zo'n gevoel dat 't doodsimpel is, maar toch kom ik er niet uit
Een tweede probleem is het aanslaan van akkoorden (meer dan één noot tegelijkertijd), dit lukt ook niet.
Hier heb ik al geprobeerd om port[$60] te gebruiken (toetsenbord), maar hier lukt het ook niet mee.
Sorry voor de vage titel, maar ik kan niet echt een passende titel vinden voor dit probleem.
Ik ben sinds kort begonnen met het schrijven van een 'piano' in turbo pascal 7.
Nu gebruik ik voor de toetsaanslagen een case-of statement over de getkey-functie.
In die case-of statement zet ik de noot aan, schrijf ik de noot op het scherm, en zet ik de noot uit.
In een notendop (zonder omliggende procedures, behalve die waar het probleem zit) ziet het programma er zo uit:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| [...] Procedure Keys; Begin KeyMap:=ReadKey; {stop de waarde van ReadKey in variabele KeyMap); Case KeyMap Of '~' : Quit:=true; {beëindig programma} '2' : Begin SetNoteOn(1,54,100); {Zet noot F sharp 4, midi 54, aan op kanaal 1 met velocity=100} Writeln('F Sharp 4'); {Schrijf de gedrukte noot uit} end; end; end; Begin GMPort:=$331 ResetGM; repeat keys; until quit; end. |
Als ik nu dus een toon langer aansla dan "een bepaalde tijd" (maximale toonduur misschien?!), gaat de noot lussen maken. Dus tringggggg-trrrrrrrrrrrring.
Hoe kan ik ervoor zorgen dat er pas een nieuwe noot aangeslagen kan worden wanneer de vorige los gelaten is (en dus geen toetsen worden gedrukt)?
Ik heb al geprobeerd variabelen in te voegen die tijdens het drukken van een knop een bepaalde waarde krijgen, maar hij moet juist wél ingedrukt kunnen blijven.. de toon moet zich alleen niet herhalen.
Ook heb ik geprobeerd om een kopie van de vorige ingedrukte toets in een variabele te zetten:
Delphi:
1
2
3
4
5
6
| [...] KeyOld:=keymap; Keymap:=ReadKey; If KeyMap<>KeyOld then keys; [...] |
Maar, omdat je soms 2 keer dezelfde toets achter elkaar wilt aanslaan, zal dit niet werken.
Heeft iemand hier een oplossing voor? Ik heb zo'n gevoel dat 't doodsimpel is, maar toch kom ik er niet uit
Een tweede probleem is het aanslaan van akkoorden (meer dan één noot tegelijkertijd), dit lukt ook niet.
Hier heb ik al geprobeerd om port[$60] te gebruiken (toetsenbord), maar hier lukt het ook niet mee.
[ Voor 0% gewijzigd door een moderator op 06-09-2007 12:16 . Reden: even de highlighter erbij aangezet :P ]
IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;