'**************************************************************** '* Name : Trumpet_Valves.BAS * '* Author : Godfried-Willem RAES * '* Notice : Copyleft (c) 2021 Logosoft Public Domain * '* Date : 15-06-2021 * '* Version : 1.0 * '* Notes : First working version 15.06.2021 * '* Last update: 08.07.2021 * '**************************************************************** ' 15.06.2021: Specific code for the hub-valve board for brass instruments. ' needs further revision for the valve lookups. On Bug we had ' all valves on portA, so coding was more comfortable. ' after timeout we can do: ' Holdvalve1 = VeloValve1 ' Holdvalve2 = VeloValve2 ' Holdvalve3 = VeloValve3 ' clear VeloValve1 ' clear VeloValve2 ' clear VeloValve3 ' 16.06.2021: Controller 80 added for dynamic range. ' controller 33 added for fingering lookup tables. ' Debug session on test board. ' 17.06.2021: Further coding. ' 20.06.2021: CC66 power on/off wrong. Switches on on cold boot! ' 21.06.2021: ctrl 40-43 added for wavetables, as implemented on ' 23.06.2021: Empirical lookup for fingerings added. ' This table is now the default on start-up, CC33 = 0 ' 08.07.2021: On request of Alain: gap in the ambitus filled. ' 18.07.2021: Firmware upgrade upload. Include "18F2620.inc" ' file must be in the working directory. Clear ' Mapping defines for midi-events on pin outputs and inputs: ' mapping: $define relay PORTA.3 $define HoldValve1 PORTA.4 $define VeloValve1 PORTA.5 ' out 1 weidnueller - 1/2 t valve $define HoldValve2 PORTC.0 ' out 2 weidmueller - 1t valve $define VeloValve2 PORTC.1 $define HoldValve3 PORTC.2 ' out 3 weidmueller - 1 1/2 t valve $define VeloValve3 PORTC.3 $define HoldValve4 PORTC.5 ' out 4 weidmueller - not used on trumpet $define VeloValve4 PORTC.4 $define light PORTB.2 $define eyeright PORTB.1 $define eyeleft PORTB.0 $define loopcnt PORTA.2 ' for loopspeed measurement only $define GreenLed PORTB.3 $define Debug_Led PORTB.5 ' for testing - red led - watchdog ' configure the input and output pins: Clear SSPCON1.5 'RC3 must be available for I/O TRISA = %01000011 'bits set to 0 are output, 1 = input TRISB = %11100000 TRISC = %11000000 'RC1 en RC2 zijn pwm outputs and must be set to output 'RC6 en RC7 zijn USART I/O and must be set to input 'constant definitions: 'initialisations for the midi input parser: Symbol Midichannel = 12 ' Trumpet_Channel Symbol NoteOff_Status = 128 + Midichannel ' 2 bytes follow Symbol NoteOn_Status = 144 + Midichannel Symbol Keypres_Status = 160 + Midichannel ' 2 bytes follow Symbol Control_Status = 176 + Midichannel Symbol ProgChange_Status = 192 + Midichannel ' 1 byte message Symbol Aftertouch_Status = 208 + Midichannel ' 1 byte follows Symbol Pitchbend_Status = 224 + Midichannel ' lsb msb follow 'application specific constants Symbol LowPed = 40 Symbol HighPed = 51 ' was 46 , overeenkomstig akoestische wetten. Symbol Lowtes = 52 Symbol Hightes = 94 Symbol NrTasks = 2 Symbol LastTask = NrTasks - 1 ' default startup parameters: Symbol force_default = 88 ' value to be determined on Symbol releasetime_default = 32 ' value to be determined on Symbol CC33_default = 0 ' default lookup table for valves. ' with 10, we get the 'normal' fingering for a Bb trumpet ' with = 9, we get the lookup used as default on ' 9 would set the instrument to A instead of Bb. ' 12 would be a C-trumpet ' Setup the USART Declare Hserial_Baud = 31250 ' Set baud rate for the USART to MIDI specs. Declare Hserial_TXSTA = 0x24 ' instead of the normal 0x20 - ?? 0x24 Declare All_Digital = True ' Declare Hserial_Clear = On ' should clear on errors. Bytes get lost of course... ' Create variables Dim Cnt As Dword System Dim CntHw As Cnt.Word1 'used in the timer0 interrupt, to create a 32 bit timer Dim CntLw As TMR0L.Word 'this is the trick to read both TMR0L and TMR0H 'it makes Cntlw the low word of cnt 'We still have to copy the contents of Lw to Cnt Dim time As Cnt ' was : Dword 'frozen copy of Cnt Dim MaxTim As time.30 ' overflow flag used to reset timer Dim Tim3 As TMR3L.Word ' 16 bit counter for sampler Dim Bytein As Byte System ' midi byte read from buffer Dim StBit As Bytein.7 ' highest bit of ByteIn Dim i As Byte ' general purpose counter Dim b As Byte ' midi variables Dim Ringbuffer[256] As Byte ' Array for holding received midi messages Dim statusbyte As Byte System Dim noteUit As Byte System ' note off + release value Dim release As Byte System Dim noteAan As Byte System ' note on + release value Dim velo As Byte System Dim notePres As Byte System ' note pressure + pressure value Dim pres As Byte System Dim Ctrl As Byte System ' continuous controller + value Dim value As Byte System Dim prog As Byte System ' program change + program-byte Dim aft As Byte System ' channel aftertouch Dim pblsb As Byte System ' pitch bend lsb Dim pbmsb As Byte System ' pitch bend msb Dim idx As Byte System ' timer indexes Dim Nxt As Dword ' first timer to time-out Dim Timvals[NrTasks] As Dword ' timer values for the tasks and events 0 - 4 Dim Resort As Byte Dim Resort_flag As Resort.0 ' flag to signal the requirement to resort timers Dim CC66 As Byte ' global on/off switch Dim PowerOn As CC66.0 Dim st As Byte System Dim b1 As Byte System Dim b2 As Byte System Dim minvel As Word System ' may become symbol Dim varvel As Word System Dim Fingers[128] As Byte ' valve fingering lookup table Dim Valves As Byte ' reflects the bits any time ' valves.0 = valve1 (central valve, 1/2tone) ' valves.1 = valve2 (valve at mouhpiece, 1t) ' valves.2 = valve3 (valve at horn, 1 1/2 t) ' valves.3 = holdbit for valve1 ' valves.4 = holdbit for valve2 ' valves.5 = holdbit for valve3 Dim CC33 As Byte ' valve lookuptable controller Dim shift As SByte ' signed byte, used in the lookups Dim playingnote As Byte Dim releasetime As Byte System ' cc26 Dim Dur[128] As Word ' for valve pulsing and holdtime Dim Dur5[128] As Word ' for light repetitions Dim force As Byte System ' cc25 Dim CC69 As Byte ' only bit 0 is used: CC69.0 ' for lights automation only '----------------------------------------------------------------------------------------- ' Load our USART Interrupt handler And buffer read subroutines into memory Include "Trumpet_Irq.inc" 'make sure we initialize those pins on start up: Low Debug_Led Low GreenLed Low loopcnt Low relay ' 20.06.21: without this, the relay goes on on cold boot! Clear CC66 '----------------------------------------------------------------------------------------- MAIN: High Debug_Led DelayMS 50 ' wait for stability Low Debug_Led Set idx Set Timvals Low VeloValve1 Low VeloValve2 Low VeloValve3 Low HoldValve1 Low HoldValve2 Low HoldValve3 ' not used, but cleared for ease on readings on the debug board: Low VeloValve4 Low HoldValve4 Clear Valves 'GoSub Trumpet_Valve_Lookup_2 ' read fingering table - default CC33= 2 ' in theory we should use the first lookup, but on ' shifted a semitone lower it gives much better CC33 = CC33_default ' resonances. [19.12.2016] If CC33 = 0 Then GoSub Fingers_gwr ' empirische lookup Else GoSub Fingers_Lookup ' theoretische lookup for EndIf GoSub Dur_Lookup Set idx Set Timvals Set CC69.0 Init_Usart_Interrupt ' Initiate the USART serial buffer interrupt ' this procedure is in the include file Clear_Serial_Buffer ' Clear the serial buffer and reset its pointers ' in the include as well ' Configure Timer0 for: ' Clear TMR0L and TMR0H registers ' Interrupt on Timer0 overflow ' 16-bit operation ' Internal clock source 40MHz ' 1:256 Prescaler : thus 40MHz / 256 = 156.250kHz ' Opentimer0 (Timer_INT_On & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256) in macro file. Clear T1CON Clear IntConBits_T0IF ' clear interrupt flag Set INTCONBITS_T0IE ' enable interrupt on overflow T0CON = %10000111 ' bit 7 = enable/disable ' bit 6 = 1=8 bit, 0=16 bit ' bit 5 = 1 pin input, 0= Internal Clk0 ' bit 4 = HL or LH transition when bit5 =1 ' bit 3 = 1= bypass prescaler, 0= input from prescaler ' bit 2-0 = prescaler select: 111= 1:256 ' Setup the High priorities for the interrupts ' open and start timer3 for further sampling in the IRQ_service routine: Clear T3CON Clear PIR2BITS_TMR3IF ' clear IRQ flag Set PIE2BITS_TMR3IE ' irq on Clear Tim3 ' Clear TMR3L And TMR3H registers Set RCONbits_IPEN ' Enable priority interrupts Clear IPR2bits_TMR3IP ' Set Timer3 as a low priority interrupt source ' we can also set T3Con in one instruction as: T3CON = %10110001 ' oef, now it works... ' bit 7 = 16 bit mode ' bit 6,3 = 0, 0 ' bit 5,4 = 1:8 prescale ' bit 2 = 0 ' bit 1 = 0 Internal clock = Fosc/4 ' bit 0 : 1= enable timer 3, 0= disable ' maximum count = 52.42ms, 1 tick =0.8uS, lowest freq.=19Hz GoSub Dur_Lookup ' set controllers to default values on cold boot: force = force_default releasetime = releasetime_default Clear Valves ' start the main program loop: Do Cnt.Word0 = CntLw ' read timer 0 ' was : time = Cnt , make copy (dword!) but now time is an alias for Cnt ' Create an infinite loop GetMidiIn () ' in Trumpet_Hub_Irq.inc Bytein = MidiIn ' Read data from the serial buffer, with no timeout ' Start the midi parser. Midi_Parse: If Bytein > Pitchbend_Status Then ' here higher statusses are not implemented. If Bytein > 253 Then '254 = midiclock, 255= reset 'midiclock can interrupt all other msg's... '255 had to be intercepted since thats what we 'get when no new byte flows in (?) GoTo Check_Timers 'throw away... Else Clear statusbyte 'reset the status byte GoTo Check_Timers 'throw away End If EndIf If StBit =1 Then 'should be faster than If Bytein > 127 Then 'status byte received, bit 7 is set Clear statusbyte 'if on another channel, the statusbyte needs a reset Select Bytein 'eqv to Select case ByteIn Case NoteOff_Status statusbyte = Bytein Set noteUit 'reset value. Cannot be 0 !!! Set release '0 is a valid midi note! Case NoteOn_Status statusbyte = Bytein Set noteAan Set velo Case Keypres_Status ' used for lights statusbyte = Bytein Set notePres Set pres Case Control_Status ' this is the main thing to listen to.... statusbyte = Bytein Set Ctrl Set value Case ProgChange_Status statusbyte = Bytein Set prog Case Aftertouch_Status statusbyte = Bytein Set aft Case Pitchbend_Status statusbyte = Bytein Set pblsb Set pbmsb EndSelect Else 'midi byte is 7 bits Select statusbyte Case 0 'not a message for this channel GoTo Check_Timers 'disregard Case NoteOff_Status If noteUit = 255 Then noteUit = Bytein Else release = Bytein 'message complete, so we can do the action... Select noteUit Case LowPed To Hightes If Valves > 0 Then ' clear all velo bits: Clear VeloValve1 Clear VeloValve2 Clear VeloValve3 Set Timvals[0] ' clear force timer Timvals[1] = time + Dur5[releasetime] 'add the timeout duration Set Resort_flag EndIf Clear playingnote If CC69.0 = 1 Then Clear eyeleft Clear eyeright EndIf HRSOut statusbyte, noteUit, release ' gives a 1ms delay ' Case LowPed To HighPed ' If Valves > 0 Then ' ' clear all velo bits: ' Clear VeloValve1 ' Clear VeloValve2 ' Clear VeloValve3 ' Set Timvals[0] ' clear force timer ' Timvals[1] = time + Dur5[releasetime] 'add the timeout duration ' Set Resort_flag ' EndIf ' Clear playingnote ' If CC69.0 = 1 Then ' Clear eyeleft ' Clear eyeright ' EndIf ' HRSOut statusbyte, noteUit, release ' gives a 1ms delay ' Case Lowtes To Hightes ' If Valves > 0 Then ' ' clear all velo bits: ' Clear VeloValve1 ' Clear VeloValve2 ' Clear VeloValve3 ' Set Timvals[0] ' clear force timer ' Timvals[1] = time + Dur5[releasetime] 'add the timeout duration ' Set Resort_flag ' EndIf ' Clear playingnote ' If CC69.0 = 1 Then ' Clear eyeleft ' Clear eyeright ' EndIf ' HRSOut statusbyte, noteUit, release ' gives a 1ms delay EndSelect Set noteUit 'reset EndIf Case NoteOn_Status If noteAan = 255 Then noteAan = Bytein Else velo = Bytein If velo = 0 Then Select noteAan Case LowPed To Hightes If Valves > 0 Then ' clear all velo bits: Clear VeloValve1 Clear VeloValve2 Clear VeloValve3 Set Timvals[0] ' set the release timer Timvals[1] = time + Dur5[releasetime] Set Resort_flag EndIf Clear playingnote If CC69.0 = 1 Then Clear eyeleft Clear eyeright EndIf HRSOut statusbyte, noteAan, velo ' Case LowPed To HighPed ' If Valves > 0 Then ' ' clear all velo bits: ' Clear VeloValve1 ' Clear VeloValve2 ' Clear VeloValve3 ' Set Timvals[0] ' ' set the release timer ' Timvals[1] = time + Dur5[releasetime] ' Set Resort_flag ' EndIf ' Clear playingnote ' If CC69.0 = 1 Then ' Clear eyeleft ' Clear eyeright ' EndIf ' HRSOut statusbyte, noteAan, velo ' Case Lowtes To Hightes ' If Valves > 0 Then ' ' clear all velo bits: ' Clear VeloValve1 ' Clear VeloValve2 ' Clear VeloValve3 ' Set Timvals[0] ' ' set the release timer ' Timvals[1] = time + Dur5[releasetime] ' Set Resort_flag ' EndIf ' Clear playingnote ' If CC69.0 = 1 Then ' Clear eyeleft ' Clear eyeright ' EndIf ' HRSOut statusbyte, noteAan, velo EndSelect Else Select noteAan Case LowPed To Hightes If Fingers[noteAan] <> Fingers[playingnote] Then Valves = Fingers[noteAan] VeloValve1 = Valves.0 VeloValve2 = Valves.1 VeloValve3 = Valves.2 Clear HoldValve1 Clear HoldValve2 Clear HoldValve3 Timvals[0] = time + Dur[force] EndIf playingnote = noteAan 'clear release timer Set Timvals[1] Set Resort_flag If CC69.0 = 1 Then Set eyeleft 'automates eyes with notes playing. Set eyeright EndIf HRSOut statusbyte, noteAan, velo ' for synth board ' Case LowPed To HighPed ' If Fingers[noteAan] <> Fingers[playingnote] Then ' Valves = Fingers[noteAan] ' VeloValve1 = Valves.0 ' VeloValve2 = Valves.1 ' VeloValve3 = Valves.2 ' Clear HoldValve1 ' Clear HoldValve2 ' Clear HoldValve3 ' Timvals[0] = time + Dur[force] ' EndIf ' playingnote = noteAan ' 'clear release timer ' Set Timvals[1] ' Set Resort_flag ' If CC69.0 = 1 Then ' Set eyeleft 'automates eyes with notes playing. ' Set eyeright ' EndIf ' HRSOut statusbyte, noteAan, velo ' for synth board ' Case Lowtes To Hightes ' If Fingers[noteAan] <> Fingers[playingnote] Then ' Valves = Fingers[noteAan] ' VeloValve1 = Valves.0 ' VeloValve2 = Valves.1 ' VeloValve3 = Valves.2 ' Clear HoldValve1 ' Clear HoldValve2 ' Clear HoldValve3 ' Timvals[0] = time + Dur[force] ' EndIf ' playingnote = noteAan ' 'clear release timer ' Set Timvals[1] ' Set Resort_flag ' If CC69.0 = 1 Then ' Set eyeleft 'automates eyes with notes playing. ' Set eyeright ' EndIf ' HRSOut statusbyte, noteAan, velo ' for synth board EndSelect End If Set noteAan '= 255 'reset EndIf Case Keypres_Status 'used for lite flashing speed modulation If notePres = 255 Then notePres = Bytein Else pres = Bytein GoSub KeyPres Set notePres EndIf Case Control_Status 'this is where the action takes place for controllers If Ctrl = 255 Then Ctrl = Bytein Else value = Bytein Select Ctrl Case 1 To 7 HRSOut Control_Status, Ctrl, value ' for the synth board : 1,2,3,4,5,6,7 Case 13 ' fingering controller ' bit 0 = valve 1 ' bit 1 = valve 2 ' bit 2 = valve 3 If playingnote > 0 Then ' fingering changes are only valid if a note is played! ' stop the release timer Set Timvals[1] Valves = value & %00000111 ' and mask Clear HoldValve1 Clear HoldValve2 Clear HoldValve3 VeloValve1 = Valves.0 VeloValve2 = Valves.1 VeloValve3 = Valves.2 ' ' clear all valve bits: ' PORTA = PORTA & %11000000 ' and-mask ' ' here we have to set a velo-timer! ' PORTA = PORTA | Valves ' or-mask Timvals[0] = time + Dur[force] Set Resort_flag EndIf Case 15 To 20 ' check this range if firmware is changed 16,17,18,19 ' adapted 09.12.2020, as CC15 and CC20 are implemented now. ' for the synth board HRSOut Control_Status, Ctrl, value Case 25 ' valve attack force controller 5ms to 38ms force = 128 - value ' runs 128 --> 1 If force > 127 Then force = 127 ' 127 --> 1 can never be zero! ' uses Dur[] lookup Case 26 ' valve release time controller releasetime = 128 - value If releasetime > 127 Then releasetime = 127 ' uses Dur5[] lookup Case 33 ' used to change the valve-note lookup tables. ' value 0 = empirical table ' value 1 = c# trumpet fingerings ' value 10 = Bb trumpet fingerings ' value 12 = C trumpet fingerings If value <> CC33 Then CC33 = value If CC33 > 12 Then CC33 = 12 Select value Case 0 GoSub Fingers_gwr Case Else GoSub Fingers_Lookup EndSelect EndIf Case 40 To 43 ' used to change the wavetables on the 24F pic ' 40 = pedal wave ' 41 = low ' 42 = medium ' 43 = high HRSOut Control_Status, Ctrl, value Case 66 ' on/off for the robot HRSOut Control_Status, 66, value If value = 0 Then Clear PowerOn ' CC66.0 GoSub PowerDown Clear GreenLed Clear relay Else Set PowerOn ' CC66.0 Set GreenLed Set relay Set CC69.0 EndIf Case 69 ' eye-lights automation on or off. This is ON by default! ' so far, no lights mounted on trumpet. If value = 0 Then Clear CC69.0 Else Set CC69.0 EndIf Case 80 HRSOut Control_Status, 80, value Case 100 To 110 ' waveform params for synth HRSOut Control_Status, Ctrl, value Case 123 HRSOut Control_Status, 123, value ' clear all output ports used: Clear VeloValve1 Clear VeloValve2 Clear VeloValve3 Clear HoldValve1 Clear HoldValve2 Clear HoldValve3 Clear playingnote Clear Valves Set Timvals Set Resort_flag EndSelect Set Ctrl EndIf Case ProgChange_Status If prog = 255 Then 'single byte message prog = Bytein HRSOut ProgChange_Status, prog ' for Synth board. Prog's 0-10 implemented ' bits 0,1,2,3 EndIf Set prog Case Pitchbend_Status If pblsb = 255 Then pblsb = Bytein Else pbmsb = Bytein HRSOut Pitchbend_Status, pblsb, pbmsb ' for synth board Set pblsb EndIf EndSelect EndIf If Resort_flag = 1 Then GoSub SortTimers ' so we resort only if an incoming midi command or a motor process changed something EndIf Check_Timers: If idx < NrTasks Then ' we moeten alleen checken wanneer er een timer loopt If time >= Nxt Then ' nagaan of de eerstvolgende timer afgelopen is... ' in dit geval is de eerste timer afgelopen en moeten we de juiste aktie ondernemen: Set Nxt.31 ' timer reset, is immers afgelopen ' aan de hand van idx weten we welke timer dit is Select idx Case 0 ' one shot Set Timvals[0] ' cancel velo timer HoldValve1 = VeloValve1 HoldValve2 = VeloValve2 HoldValve3 = VeloValve3 Clear VeloValve1 Clear VeloValve2 Clear VeloValve3 Clear Valves ' maybe we do not even need this Valves.3 = HoldValve1 Valves.4 = HoldValve2 Valves.5 = HoldValve3 Case 1 Clear VeloValve1 Clear VeloValve2 Clear VeloValve3 Clear HoldValve1 Clear HoldValve2 Clear HoldValve3 Clear playingnote Clear Valves Set Timvals[1] ' Case 2 ' Btg Eye_Left ' toggle ' Timvals[2] = time + Dur5[velo2] ' Case 3 ' Btg Eye_Right ' Timvals[3] = time + Dur5[velo3] 'Case Else ' ' in dit geval is idx geset ' GoTo jumpout EndSelect GoSub SortTimers ' find a new nxt and idx EndIf Else ' idx > 5, no timers running, so to avoid overflows, we can reset the timer If MaxTim = 1 Then Clear Cnt Set Timvals EndIf EndIf Btg loopcnt ' for loopspeed measurement: 16.06.2021: 104-131kHz or 3.75 to 5us Loop ' end of the main loop SortTimers: 'look up the next smallest timer value in the Timvals array ' zoek de de volgende kleinste timer waarde: Set idx Set Nxt.31 ' nxt is set on entry. - for speed, we just set the highest bit For i = 0 To LastTask ' =NrTasks -1 If Timvals[i] < Nxt Then Nxt = Timvals[i] ' NrTasks dword comparisons idx = i EndIf Next i Clear Resort_flag Return KeyPres: 'the note to which the pressure should be applied is passed in NotePres, the value in Pres ' Select notePres ' Case 120 To 126 ' HRSOut Notepress_Status, notePres, pres ' EndSelect Set notePres '= 255 Return 'ProgChange: ' ' not used on ' ' here we should use a controller. ' Select prog ' Case 1 ' 16 in midi ' GoSub Trumpet_Valve_Lookup ' Case 2 ' 32 in midi - this is default ' GoSub Trumpet_Valve_Lookup_2 ' Case 3 ' 48 in midi ' Case 4 ' 64 in midi ' Case 5 ' 80 in midi ' Case 6 ' 96 in midi ' Case 7 ' 112 in midi ' EndSelect ' Set prog 'this is not realy required 'Return 'Pitchbend: ' 'only implemented on the synth board ' Set pblsb 'Return Aftertouch: 'this is the channel aftertouch, affecting all notes Set aft Return PowerDown: Clear VeloValve1 Clear VeloValve2 Clear VeloValve3 Clear HoldValve1 Clear HoldValve2 Clear HoldValve3 Clear eyeleft Clear eyeright Clear light 'clear relay Clear playingnote Clear Valves Set Timvals Set Resort_flag CC33 = CC33_default If CC33 = 0 Then GoSub Fingers_gwr Else GoSub Fingers_Lookup EndIf Return 'Trumpet_Valve_Lookup: '' no longer used for trumpeter '' bit0 = valve 1, semitone down (central valve) '' bit1 = valve 2 tone down (valve closest to mouthpiece) '' bit2 = valve 3 3 half tones down (valve closest to horn) '' this is the data set used for : ''40 0111 ' pedaal mi, allerlaagste mogelijke toon. ''41 0110 ' pedaal fa ''42 0101 ' pedaal fa# ''43 0100 ' pedaal sol ''44 0010 ' pedaal ''45 0001 ' pedaaltoon ''46 0000 ' pedaaltoon Si b ''47-51: onspeelbare noten! '' this is the data set used for and : ''52 0111 ' alle ventielen ingedrukt - eerste oktaaftoon - Mi ''53 0110 ' Fa ''54 0101 ' Fa# ''55 0100 ' sol ''56 0010 ' sol# ''57 0001 ' la ''58 0000 ' eerste oktaafharmoniek op grondtoon - sib ''59 0111 ' kwint op mi = si ''60 0110 ' do ''61 0101 ' do# ''62 0100 ' re ''63 0010 ' mib ''64 0001 ' mi ''65 0000 ' fa kwint op grondtoon ''66 0101 ' fa# ''67 0100 ' sol ''68 0010 ' lab ''69 0001 ' la ''70 0000 ' sib tweede oktaaf boven grondtoon ''71 0010 ' si terts ''72 0001 ' do terts ''73 0000 ' do# terts ''74 0100 ' re - dubbelkwint ''75 0010 ' mib - dubbelkwint ''76 0001 ' mi - dubbelkwint ''77 0000 ' fa - dubbelkwint ''78 0010 ' fa# - septiem ''79 0001 ' sol - septiem ''80 0000 ' lab - septiem ''81 0001 ' la - triple oktaaf ''82 0000 ' sib - triple oktaaf 'Clear Fingers ' maak het hele array blank ''For i = 0 To 53 '' Fingers[i] = 0 ''Next i 'Fingers[40] = %111 'Fingers[41] = %110 'Fingers[42] = %101 'Fingers[43] = %100 'Fingers[44] = %010 'Fingers[45] = %001 'Fingers[46] = 0 'Fingers[52] = %111 'Fingers[53] = %110 'Fingers[54] = %101 'Fingers[55] = %100 'Fingers[56] = %010 'Fingers[57] = %001 'Fingers[58] = 0 ' sounds Bb - The flugelhorn plays C 'Fingers[59] = %111 ' kwint boven 111 'Fingers[60] = %110 'Fingers[61] = %101 'Fingers[62] = %100 'Fingers[63] = %010 'Fingers[64] = %001 'Fingers[65] = %000 ' or Fingers[65] = %110 'Fingers[66] = %101 'Fingers[67] = %100 ' okt 'Fingers[68] = %010 'Fingers[69] = %001 'Fingers[70] = 0 ' oktaaf Bb 'Fingers[71] = %010 'Fingers[72] = %001 'Fingers[73] = %000 'Fingers[74] = %100 'Fingers[75] = %010 'Fingers[76] = %001 'Fingers[77] = 0 'Fingers[78] = %010 ' fa# septiem 'Fingers[79] = %100 ' or 001, septiem 'Fingers[80] = %010 ' or 0, septiem 'Fingers[81] = %001 'Fingers[82] = 0 'dubbeloktaaf Bb 'Fingers[83] = %010 'Fingers[84] = %001 'Fingers[85] = %000 'Fingers[86] = %100 'Fingers[87] = %010 'Fingers[88] = %001 'Fingers[89] = %000 'Fingers[90] = %010 'Fingers[91] = %100 'Fingers[92] = %010 'Fingers[93] = %001 'Fingers[94] = 0 'triple oktaaf Bb ''For i = 95 To 127 '' Fingers[i] = 0 ''Next i 'Return 'Trumpet_Valve_Lookup_2: '' no longer used for trumpeter '' everything shifted a semitone down, as this seems '' to give much better resonance '' bit0 = valve 1, semitone down (central valve) '' bit1 = valve 2 tone down (valve closest to mouthpiece) '' bit2 = valve 3 3 half tones down (valve closest to horn) '' this is the data set used for : 'For i = 0 To 51 ' Fingers[i] = 0 'Next i 'Fingers[52] = %111 'Fingers[53] = %110 'Fingers[54] = %101 'Fingers[55] = %100 'Fingers[56] = %010 'Fingers[57] = %001 'Fingers[58] = 0 ' sounds Bb - The flugelhorn plays C 'Fingers[59] = %111 ' kwint boven 111 'Fingers[60] = %110 'Fingers[61] = %101 'Fingers[62] = %100 'Fingers[63] = %010 'Fingers[64] = %001 'Fingers[65] = %000 ' or Fingers[65] = %110 'Fingers[66] = %101 'Fingers[67] = %100 ' okt 'Fingers[68] = %010 'Fingers[69] = %001 'Fingers[70] = 0 ' oktaaf Bb 'Fingers[71] = %010 'Fingers[72] = %001 'Fingers[73] = %000 'Fingers[74] = %100 'Fingers[75] = %010 'Fingers[76] = %001 'Fingers[77] = 0 'Fingers[78] = %010 ' fa# septiem 'Fingers[79] = %100 ' or 001, septiem 'Fingers[80] = %010 ' or 0, septiem 'Fingers[81] = %001 'Fingers[82] = 0 'dubbeloktaaf Bb 'Fingers[83] = %010 'Fingers[84] = %001 'Fingers[85] = %000 'Fingers[86] = %100 'Fingers[87] = %010 'Fingers[88] = %001 'Fingers[89] = %000 'Fingers[90] = %010 'Fingers[91] = %100 'Fingers[92] = %010 'Fingers[93] = %001 'Fingers[94] = 0 'triple oktaaf Bb 'For i = 95 To 127 ' Fingers[i] = 0 'Next i '' shift the whole array a semitone down: [19.12.2016] 'For i = 1 To 127 ' Fingers[i-1] = Fingers[i] 'Next i 'Return Dur_Lookup: Set Dur[0] ' lookup for valve force (ctrl 25) ' 1 time unit here is 26us (measured 04.12.2016) Dur[1]= 23674 ' period = 616ms or freq = 1.622Hz Dur[2]= 22917 Dur[3]= 22548 ' freq= 2.21749157353202 Dur[4]= 22185 ' freq= 2.25377507324769 Dur[5]= 21827 ' freq= 2.29074082558299 Dur[6]= 21475 ' freq= 2.32828870779977 Dur[7]= 21129 ' freq= 2.36641582658905 Dur[8]= 20789 ' freq= 2.40511809129828 Dur[9]= 20454 ' freq= 2.44450963136795 Dur[10]= 20124 ' freq= 2.48459550785132 Dur[11]= 19800 ' freq= 2.52525252525252 Dur[12]= 19481 ' freq= 2.56660335711719 Dur[13]= 19167 ' freq= 2.60865028434288 Dur[14]= 18858 ' freq= 2.65139463357726 Dur[15]= 18554 ' freq= 2.69483669289641 Dur[16]= 18255 ' freq= 2.73897562311695 Dur[17]= 17961 ' freq= 2.7838093647347 Dur[18]= 17672 ' freq= 2.82933454051607 Dur[19]= 17387 ' freq= 2.87571173865532 Dur[20]= 17107 ' freq= 2.92278014847723 Dur[21]= 16831 ' freq= 2.97070881112233 Dur[22]= 16560 ' freq= 3.01932367149758 Dur[23]= 16293 ' freq= 3.06880255324372 Dur[24]= 16030 ' freq= 3.11915159076731 Dur[25]= 15772 ' freq= 3.17017499365965 Dur[26]= 15518 ' freq= 3.22206469905916 Dur[27]= 15268 ' freq= 3.27482315954938 Dur[28]= 15022 ' freq= 3.32845160431367 Dur[29]= 14780 ' freq= 3.382949932341 Dur[30]= 14542 ' freq= 3.43831660019254 Dur[31]= 14307 ' freq= 3.4947927587894 Dur[32]= 14077 ' freq= 3.55189315905378 Dur[33]= 13850 ' freq= 3.6101083032491 Dur[34]= 13627 ' freq= 3.66918617450649 Dur[35]= 13407 ' freq= 3.72939509211606 Dur[36]= 13191 ' freq= 3.79046319460238 Dur[37]= 12978 ' freq= 3.85267375558638 Dur[38]= 12769 ' freq= 3.91573341686898 Dur[39]= 12564 ' freq= 3.97962432346386 Dur[40]= 12361 ' freq= 4.04498017959712 Dur[41]= 12162 ' freq= 4.1111659266568 Dur[42]= 11966 ' freq= 4.17850576633796 Dur[43]= 11773 ' freq= 4.24700586086809 Dur[44]= 11583 Dur[45]= 11397 ' freq= 4.38711941739054 Dur[46]= 11213 ' freq= 4.45910996165165 Dur[47]= 11032 ' freq= 4.53226976069616 Dur[48]= 10855 ' freq= 4.60617227084293 Dur[49]= 10680 ' freq= 4.6816479400749 Dur[50]= 10508 ' freq= 4.75827940616673 Dur[51]= 10338 ' freq= 4.83652544012381 Dur[52]= 10172 ' freq= 4.91545418796697 Dur[53]= 10008 ' freq= 4.99600319744204 Dur[54]= 9846 ' freq= 5.07820434694292 Dur[55]= 9688 ' freq= 5.16102394715111 Dur[56]= 9532 ' freq= 5.24548887956357 Dur[57]= 9378 ' freq= 5.33162721262529 Dur[58]= 9227 ' freq= 5.4188793757451 Dur[59]= 9078 ' freq= 5.50782110597048 Dur[60]= 8932 ' freq= 5.59785042543663 Dur[61]= 8788 ' freq= 5.68957669549385 Dur[62]= 8646 ' freq= 5.78302105019662 Dur[63]= 8507 Dur[64]= 8370 Dur[65]= 8235 ' freq= 6.07164541590771 Dur[66]= 8102 ' freq= 6.17131572451246 Dur[67]= 7972 ' freq= 6.27195183140993 Dur[68]= 7843 ' freq= 6.37511156445238 Dur[69]= 7717 ' freq= 6.47920176234288 Dur[70]= 7593 ' freq= 6.58501251152377 Dur[71]= 7470 ' freq= 6.69344042838019 Dur[72]= 7350 ' freq= 6.80272108843537 Dur[73]= 7231 ' freq= 6.91467293597013 Dur[74]= 7115 ' freq= 7.02740688685875 Dur[75]= 7000 ' freq= 7.14285714285714 Dur[76]= 6888 ' freq= 7.25900116144018 Dur[77]= 6777 ' freq= 7.37789582411096 Dur[78]= 6667 ' freq= 7.49962501874906 Dur[79]= 6560 ' freq= 7.62195121951219 Dur[80]= 6454 ' freq= 7.74713356058258 Dur[81]= 6350 ' freq= 7.8740157480315 Dur[82]= 6248 ' freq= 8.00256081946223 Dur[83]= 6147 ' freq= 8.13404912965674 Dur[84]= 6048 ' freq= 8.26719576719577 Dur[85]= 5951 ' freq= 8.40194925222652 Dur[86]= 5855 ' freq= 8.5397096498719 Dur[87]= 5760 ' freq= 8.68055555555555 Dur[88]= 5668 ' freq= 8.82145377558222 Dur[89]= 5576 ' freq= 8.96700143472023 Dur[90]= 5486 ' freq= 9.11410864017499 Dur[91]= 5398 ' freq= 9.26268988514264 Dur[92]= 5311 ' freq= 9.41442289587648 Dur[93]= 5225 ' freq= 9.56937799043062 Dur[94]= 5141 ' freq= 9.72573429293912 Dur[95]= 5058 Dur[96]= 4977 Dur[97]= 4897 Dur[98]= 4818 Dur[99]= 4740 Dur[100]= 4664 Dur[101]= 4589 Dur[102]= 4515 Dur[103]= 4442 Dur[104]= 4370 Dur[105]= 4300 Dur[106]= 4231 Dur[107]= 4162 Dur[108]= 4095 Dur[109]= 4029 Dur[110]= 3964 Dur[111]= 3901 Dur[112]= 3838 Dur[113]= 3776 Dur[114]= 3715 Dur[115]= 3655 Dur[116]= 3596 Dur[117]= 3538 Dur[118]= 3481 Dur[119]= 3425 Dur[120]= 3370 Dur[121]= 3316 Dur[122]= 3262 Dur[123]= 3210 Dur[124]= 3158 Dur[125]= 3107 Dur[126]= 3057 Dur[127]= 3008 ' 04.12.2016: Bug code: Dur[127] geeft freq = 6.386 Hz, period = 156.6ms ' = 75ms to 220ms ' this is way too much, so we divide by 16: For i = 0 To 127 Dur[i] = Dur[i] >> 4 ' the range is now 5ms to 38ms Next i Set Dur5[0] ' used for light flashing and valve release time Dur5[1]= 41667 ' = 1 second , full period = 2 seconds, freq = 0.5Hz Dur5[2]= 39494 ' freq= 1.0550125757499 Dur5[3]= 38450 ' freq= 1.08365843086259 Dur5[4]= 37434 ' freq= 1.11307011451265 Dur5[5]= 36445 ' freq= 1.14327525495038 Dur5[6]= 35482 ' freq= 1.17430434210774 Dur5[7]= 34544 ' freq= 1.20619113787247 Dur5[8]= 33631 ' freq= 1.23893629885126 Dur5[9]= 32743 ' freq= 1.27253662360403 Dur5[10]= 31877 ' freq= 1.30710752789367 Dur5[11]= 31035 ' freq= 1.34257021642232 Dur5[12]= 30215 ' freq= 1.37900601246621 Dur5[13]= 29416 ' freq= 1.41646269603844 Dur5[14]= 28639 ' freq= 1.45489251254117 Dur5[15]= 27882 ' freq= 1.49439303732396 Dur5[16]= 27146 ' freq= 1.53490999287802 Dur5[17]= 26428 ' freq= 1.57661066545583 Dur5[18]= 25730 ' freq= 1.61938074880166 Dur5[19]= 25050 ' freq= 1.66333998669328 Dur5[20]= 24388 ' freq= 1.70849051446066 Dur5[21]= 23743 ' freq= 1.75490319953951 Dur5[22]= 23116 ' freq= 1.8025033166061 Dur5[23]= 22505 ' freq= 1.85144042064726 Dur5[24]= 21910 ' freq= 1.90171915411532 Dur5[25]= 21331 ' freq= 1.95333864641445 Dur5[26]= 20768 ' freq= 2.006291730868 Dur5[27]= 20219 ' freq= 2.06076792455941 Dur5[28]= 19685 ' freq= 2.11667090000847 Dur5[29]= 19164 ' freq= 2.17421554303207 Dur5[30]= 18658 ' freq= 2.23317969057062 Dur5[31]= 18165 ' freq= 2.29378842095605 Dur5[32]= 17685 ' freq= 2.35604561304307 Dur5[33]= 17218 ' freq= 2.41994811631239 Dur5[34]= 16763 ' freq= 2.48563304102289 Dur5[35]= 16320 ' freq= 2.5531045751634 Dur5[36]= 15888 ' freq= 2.62252433702585 Dur5[37]= 15469 ' freq= 2.69355916133342 Dur5[38]= 15060 ' freq= 2.76671093404161 Dur5[39]= 14662 ' freq= 2.84181330423316 Dur5[40]= 14274 ' freq= 2.91906029610948 Dur5[41]= 13897 ' freq= 2.99824902257082 Dur5[42]= 13530 ' freq= 3.07957625030796 Dur5[43]= 13172 ' freq= 3.16327563518575 Dur5[44]= 12824 ' freq= 3.24911624038262 Dur5[45]= 12485 ' freq= 3.33733813910025 Dur5[46]= 12155 ' freq= 3.42794460441519 Dur5[47]= 11834 ' freq= 3.52092839840009 Dur5[48]= 11522 ' freq= 3.61627032343922 Dur5[49]= 11217 ' freq= 3.71459986330272 Dur5[50]= 10921 ' freq= 3.81527943106553 Dur5[51]= 10632 ' freq= 3.91898670679709 Dur5[52]= 10351 ' freq= 4.02537597011561 Dur5[53]= 10078 ' freq= 4.13441820467024 Dur5[54]= 9811 ' freq= 4.24693371385859 Dur5[55]= 9552 ' freq= 4.36208821887214 Dur5[56]= 9300 ' freq= 4.48028673835125 Dur5[57]= 9054 ' freq= 4.60201752448273 Dur5[58]= 8815 ' freq= 4.72679145396105 Dur5[59]= 8582 ' freq= 4.85512312592247 Dur5[60]= 8355 ' freq= 4.9870337123479 Dur5[61]= 8134 ' freq= 5.12253094008688 Dur5[62]= 7919 ' freq= 5.26160710527423 Dur5[63]= 7710 ' freq= 5.40423692174665 Dur5[64]= 7506 ' freq= 5.5511146638245 Dur5[65]= 7308 ' freq= 5.70151432220398 Dur5[66]= 7115 ' freq= 5.85617240571562 Dur5[67]= 6927 ' freq= 6.01510995621 Dur5[68]= 6744 ' freq= 6.1783313562673 Dur5[69]= 6565 ' freq= 6.34678852500635 Dur5[70]= 6392 ' freq= 6.51856487275761 Dur5[71]= 6223 ' freq= 6.69559162247576 Dur5[72]= 6059 ' freq= 6.87682235792485 Dur5[73]= 5898 ' freq= 7.06454165253758 Dur5[74]= 5743 ' freq= 7.25520924023449 Dur5[75]= 5591 ' freq= 7.45245334764204 Dur5[76]= 5443 ' freq= 7.65509216730969 Dur5[77]= 5299 ' freq= 7.86311882745172 Dur5[78]= 5159 ' freq= 8.07650061381405 Dur5[79]= 5023 ' freq= 8.29517552591413 Dur5[80]= 4890 ' freq= 8.52079072937969 Dur5[81]= 4761 ' freq= 8.75166281593503 Dur5[82]= 4635 ' freq= 8.98957209636821 Dur5[83]= 4513 ' freq= 9.23258734027624 Dur5[84]= 4393 ' freq= 9.48478640261021 Dur5[85]= 4277 ' freq= 9.74203101862676 Dur5[86]= 4164 ' freq= 10.0064040986231 Dur5[87]= 4054 ' freq= 10.277914816642 Dur5[88]= 3947 ' freq= 10.5565408326999 Dur5[89]= 3843 ' freq= 10.842223956978 Dur5[90]= 3741 ' freq= 11.1378419317473 Dur5[91]= 3642 ' freq= 11.4406004027091 Dur5[92]= 3546 ' freq= 11.7503290092122 Dur5[93]= 3452 ' freq= 12.0702974121282 Dur5[94]= 3361 ' freq= 12.3971040364971 Dur5[95]= 3272 ' freq= 12.7343113284434 Dur5[96]= 3186 ' freq= 13.0780498012136 Dur5[97]= 3102 ' freq= 13.4321942832581 Dur5[98]= 3020 ' freq= 13.7969094922737 Dur5[99]= 2940 ' freq= 14.172335600907 Dur5[100]= 2862 ' freq= 14.5585837409737 Dur5[101]= 2787 ' freq= 14.9503647889008 Dur5[102]= 2713 ' freq= 15.3581521071385 Dur5[103]= 2641 ' freq= 15.7768522024486 Dur5[104]= 2571 ' freq= 16.2064047711656 Dur5[105]= 2504 ' freq= 16.640042598509 Dur5[106]= 2437 ' freq= 17.0975242784845 Dur5[107]= 2373 ' freq= 17.5586458772299 Dur5[108]= 2310 ' freq= 18.037518037518 Dur5[109]= 2249 ' freq= 18.5267526307989 Dur5[110]= 2190 ' freq= 19.0258751902588 Dur5[111]= 2132 ' freq= 19.5434646654159 Dur5[112]= 2076 ' freq= 20.0706486833654 Dur5[113]= 2021 ' freq= 20.616856341745 Dur5[114]= 1967 ' freq= 21.182850364345 Dur5[115]= 1915 ' freq= 21.7580504786771 Dur5[116]= 1865 ' freq= 22.3413762287757 Dur5[117]= 1815 ' freq= 22.9568411386593 Dur5[118]= 1767 ' freq= 23.5804565176382 Dur5[119]= 1721 ' freq= 24.2107301956227 Dur5[120]= 1675 ' freq= 24.8756218905473 Dur5[121]= 1631 ' freq= 25.5466993664418 Dur5[122]= 1588 ' freq= 26.2384550797649 Dur5[123]= 1546 ' freq= 26.9512721000431 Dur5[124]= 1505 ' freq= 27.6854928017719 Dur5[125]= 1465 ' freq= 28.4414106939704 Dur5[126]= 1427 ' freq= 29.1987853305302 Dur5[127]= 1389 ' = 36ms, full period = 72ms, freq.= 13.8 Hz Return Fingers_Lookup: ' first we read the fundamental and theoretical lookup table, ' and after that we shift it according to CC33 ' bit0 = valve 1, semitone down (central valve) ' bit1 = valve 2 tone down (valve closest to mouthpiece) ' bit2 = valve 3 3 half tones down (valve closest to horn) '40 0111 ' pedaal mi, allerlaagste mogelijke toon. '41 0110 ' pedaal fa '42 0101 ' pedaal fa# '43 0100 ' pedaal sol '44 0010 ' pedaal '45 0001 ' pedaaltoon '46 0000 ' pedaaltoon Si b '47-51: onspeelbare noten! ' this is the data set used for and : '52 0111 ' alle ventielen ingedrukt - eerste oktaaftoon - Mi '53 0110 ' Fa '54 0101 ' Fa# '55 0100 ' sol '56 0010 ' sol# '57 0001 ' la '58 0000 ' eerste oktaafharmoniek op grondtoon - sib '59 0111 ' kwint op mi = si '60 0110 ' do '61 0101 ' do# '62 0100 ' re '63 0010 ' mib '64 0001 ' mi '65 0000 ' fa kwint op grondtoon '66 0101 ' fa# '67 0100 ' sol '68 0010 ' lab '69 0001 ' la '70 0000 ' sib tweede oktaaf boven grondtoon '71 0010 ' si terts '72 0001 ' do terts '73 0000 ' do# terts '74 0100 ' re - dubbelkwint '75 0010 ' mib - dubbelkwint '76 0001 ' mi - dubbelkwint '77 0000 ' fa - dubbelkwint '78 0010 ' fa# - septiem '79 0001 ' sol - septiem '80 0000 ' lab - septiem '81 0001 ' la - triple oktaaf '82 0000 ' sib - triple oktaaf Clear Fingers ' maak het hele array blank Fingers[40] = %111 Fingers[41] = %110 Fingers[42] = %101 Fingers[43] = %100 Fingers[44] = %010 Fingers[45] = %001 Fingers[46] = 0 ' tessituurgat: 47-51 Fingers[47] = %111 Fingers[48] = %110 Fingers[49] = %101 Fingers[50] = %100 Fingers[51] = %010 Fingers[52] = %111 Fingers[53] = %110 Fingers[54] = %101 Fingers[55] = %100 Fingers[56] = %010 Fingers[57] = %001 Fingers[58] = 0 ' sounds Bb - The flugelhorn plays C Fingers[59] = %111 ' kwint boven 111 Fingers[60] = %110 Fingers[61] = %101 Fingers[62] = %100 Fingers[63] = %010 Fingers[64] = %001 Fingers[65] = %000 ' or Fingers[65] = %110 Fingers[66] = %101 Fingers[67] = %100 ' okt Fingers[68] = %010 Fingers[69] = %001 Fingers[70] = 0 ' oktaaf Bb Fingers[71] = %010 Fingers[72] = %001 Fingers[73] = %000 Fingers[74] = %100 Fingers[75] = %010 Fingers[76] = %001 Fingers[77] = 0 Fingers[78] = %010 ' fa# septiem Fingers[79] = %100 ' or 001, septiem Fingers[80] = %010 ' or 0, septiem Fingers[81] = %001 Fingers[82] = 0 'dubbeloktaaf Bb Fingers[83] = %010 Fingers[84] = %001 Fingers[85] = %000 Fingers[86] = %100 Fingers[87] = %010 Fingers[88] = %001 Fingers[89] = %000 Fingers[90] = %010 Fingers[91] = %100 Fingers[92] = %010 Fingers[93] = %001 Fingers[94] = 0 'triple oktaaf Bb ' onspeelbaar oktaaf: Fingers[95] = %010 Fingers[96] = %001 Fingers[97] = %000 Fingers[98] = %100 Fingers[99] = %010 Fingers[100] = %001 Fingers[101] = %000 Fingers[102] = %010 Fingers[103] = %100 Fingers[104] = %010 Fingers[105] = %001 Fingers[106] = 0 'quad oktaaf Bb shift = CC33 - 10 If shift <> 0 Then For i = 12 To 108 Fingers[i + shift] = Fingers[i] Next i EndIf Return Fingers_gwr: ' tabel opgesteld door gwr 23.06.2021 ' met golfvorm 6 (Hunt_6) Clear Fingers ' maak het hele array blank Fingers[40] = %001 Fingers[41] = %000 Fingers[42] = %110 Fingers[43] = %101 Fingers[44] = %100 Fingers[45] = %011 Fingers[46] = %010 ' tessituur gat. (vingerzetting niet getest!) Fingers[47] = %001 Fingers[48] = %000 Fingers[49] = %001 Fingers[50] = %101 Fingers[51] = %100 Fingers[52] = %010 Fingers[53] = %001 Fingers[54] = %110 Fingers[55] = %101 Fingers[56] = %100 Fingers[57] = %011 Fingers[58] = %010 ' sounds Bb - The flugelhorn plays C Fingers[59] = %001 Fingers[60] = %000 Fingers[61] = %001 Fingers[62] = %101 Fingers[63] = %100 Fingers[64] = %010 Fingers[65] = %111 Fingers[66] = %110 Fingers[67] = %101 Fingers[68] = %100 Fingers[69] = %111 Fingers[70] = 0 ' oktaaf Bb Fingers[71] = %001 Fingers[72] = %000 Fingers[73] = %010 Fingers[74] = %101 Fingers[75] = %100 Fingers[76] = %110 Fingers[77] = 0 Fingers[78] = %001 ' fa# Fingers[79] = %010 Fingers[80] = %100 Fingers[81] = %000 Fingers[82] = %001 'dubbeloktaaf Bb Fingers[83] = %110 Fingers[84] = %011 Fingers[85] = %000 ' = officiele vingerzetting Fingers[86] = %001 Fingers[87] = %010 ' = ov Fingers[88] = %100 Fingers[89] = %101 Fingers[90] = %010 ' = ov Fingers[91] = %001 Fingers[92] = %100 Fingers[93] = %011 Fingers[94] = %010 'triple oktaaf Bb ' onspeelbaar oktaaf: - niet geimplementeerd ' deze vingerzettingen zijn ook niet getest. Fingers[95] = %010 Fingers[96] = %001 Fingers[97] = %000 Fingers[98] = %100 Fingers[99] = %010 Fingers[100] = %001 Fingers[101] = %000 Fingers[102] = %010 Fingers[103] = %100 Fingers[104] = %010 Fingers[105] = %001 Fingers[106] = 0 'quad oktaaf Bb Return '[EOF]