' ******************************************************************** ' * PIC firmware for * ' * Hub board * ' * coded by dr.Godfried-Willem Raes * ' * http://www.logosfoundation.org/instrum_gwr/pianet/picworks * ' * source code development directory: * ' * Pianet_Hub.bas * ' * Version 1.1 * ' * Positron Compiler version 3.7.3.6 * ' ******************************************************************** ' hardware: single side PCB 27.05.2020 ' 29.08.2016: start coding HybrLo, 8 mosfet outputs ' This board performs midi-filtering and has TTL parsed midi out. ' This parsing causes a 1 ms latency in the instrument. ' -------------------------------------------------------------------- ' 01.04.2021: Start coding for ' 02.04.2021: Hardware changed a bit, such that we now have a 10V regulator on board. ' 03.04.2021: Motor PWM for Laukhuff compressor inverted! ' 09.04.2021: Board wired and placed in the robot. ' 23.04.2021: First assembled tests. ' 24.04.2021: Debugging pass 1 o.k. now. ' Siemens Sinamic G110 motor controller reprogrammed. ' 03.05.2021: Checked again. Default wind setting changed to 45. ' 10.05.2021: Lookup for tremulant scaling added. ' 13.05.2021: Board reprogrammed. Scaling for tremulant evaluated as very good. ' 21.05.2021: Light- flashing lookup changed. ' default wind setting changed to 43 ' firmware upload ok. tests passed. ' 21.05.2021: Frequency lookup for lights changed again for better range ' 20.07.2021: Controller 30 reset added on startup ' ---------------------------------------------------------------------------------------------- ' Starting from hub coding for , adapting to ' 16.12.2021: Version 1.0 up and working. Vorsetzer only version. ' 16.01.2024: Controller 7 implemented on hub board ' panning would be possible as well here.(requires hardware changes though) ' (individual optors for each channel...) ' algo: PWM1 = CC7 * (CC10/127) ' PWM2 = CC7 * (1 - CC10/127) ' This code has now both CC7 (volume) and panning CC10 implemented. ' 18.01.2024: Further work on ' 19.01.2024: Provisions for lights after welding works and first assembly. ' 22.01.2024: 10 Bit PWM resolution is required for good volume control! ' Now implemented! (as on Kazumi) ' Leslie effect implemented. Although we use square wave L/R, due to the intrinsic ' slowness of the vactrols, the result ought to be pretty fluent, though certainly ' not sinusoidal. ' 23.01.2024: Wiring and testing. ' 29.01.2024: Wiring finalized, time for testing firmware... ' 10bit pwm seems not working... ' we should pass word var's instead of floats!!! Hence ivol1 and ivol2 introduced. ' CC6 bug solved. Lipro runs up to 8 now. ' PWM frequency measured as 39 kHz ' Loopspeed now is 81 kHz Include "18F2620.inc" ' version for the Pianet board.(40MHz) Include "hpwm10.inc" 'Include "C:\LogosWebsite\instrum_gwr\pianet\picworks\hpwm10.inc" ' 10-bit PWM settings 'Clear ' Mapping defines for midi-events on pin outputs and inputs: ' Power-on relay: $define Power_Relay PORTA.4 ' 5V relay, switching mains power on/off ' The +9/-24V power supplies are ' switched on with this relay. ' should also switch the audio-amp board power ' and the 12V supply. ' for Vactrol steering of amplitudes: $define Volume1 PORTC.2 ' = 10 bit PWM 1 $define Volume2 PORTC.1 ' = 10 bit PWM 2 ' Mosfet outputs for lights: $define Lite1 PORTC.0 ' E10 bulbs backside $define Lite2 PORTC.4 ' blue internal LED strip - flat $define Lite3 PORTC.5 ' blue fontal lights ok $define Lite4 PORTC.3 ' blue LED strip inside pianet - horizontal $define OrangeRot PORTA.5 ' orange rotating lite ' inputs: $define sensor1 PORTA.0 ' not used sensor on pianet $define sensor2 PORTA.1 ' not used sensor ' LED's: - implemented for $define GreenLed PORTB.2 ' on/off - follows cltr.66 $define Debug_Led PORTB.5 ' red led - watchdog $define Loopspeed PORTB.0 ' for measurement only Declare All_Digital = True ' makes all analog pins, digital for I/O Clear SSPCON1.5 ' make sure RC3 is free for use. ' configure the input and output pins: TRISA = %11000011 'bits set to 0 are output, 1 = input - bits 6 and 7 are the clock! TRISB = %11100000 'bits 6 and 7 are for the ICP, bit 5 is the red LED TRISC = %11000000 'RC6 en RC7 zijn USART I/O and must be set to input Input sensor1 ' not used Input sensor2 'constant definitions: Symbol fPwm = 21000 ' PWMminF - not applicable to 10-bit mode ' midi note mapping Symbol Lite0_note = 120 Symbol Lite1_note = 121 Symbol Lite2_note = 122 Symbol Lite3_note = 123 Symbol Lite4_note = 124 ' orange rotating light Symbol lowest_note = 29 Symbol highest_note = 88 'constants: Symbol True = 1 Symbol False = 0 Symbol LiPro_default = 5 Symbol NrTasks = 5 Symbol LastTask = NrTasks - 1 Symbol Volume_default = 0 'initialisations for the midi input parser: Symbol Midichannel = 0 ' -channel Symbol NoteOff_Status = 128 + Midichannel ' 2 bytes follow Symbol NoteOn_Status = 144 + Midichannel Symbol Keypres_Status = 160 + Midichannel 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 ' 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 Hserial_Clear = On ' should clear on errors. Bytes get lost of course... ' Create variables: Dim Cnt As Dword System '32 bit counter Dim CntHw As Cnt.Word1 'used in the timer0 interrupt, where it is incremented Dim CntLw As TMR0L.Word 'this is the trick to read both TMR0L and TMR0H Dim Tim3 As TMR3L.Word ' same trick for timer3 Dim Bytein As Byte System ' midi byte read from buffer Dim StBit As Bytein.7 ' highest bit of ByteIn Dim i As Byte System ' general purpose counter ' midi variables 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 CC66 As Byte System ' global on/off switch Dim PowerOn As CC66.0 ' handled on the hub board. Dim notes As Byte System ' used for flashing lites and note repeats Dim CC30 As Byte System ' repeat freq. controller Dim pres0 As Byte System Dim pres1 As Byte System Dim pres2 As Byte System Dim pres3 As Byte System Dim maxtim As Cnt.31 ' overflow bit, will cause timer reset after 1h45 Dim TimVals[NrTasks] As Dword ' lijst met timer waarden - de kleinste is eerst aan de beurt Dim Nxt As Dword System ' waarde voor de eerstvolgende timer Dim idx As Byte System ' index voor de eerstvolgende timer Dim resort As Byte System Dim Resort_flag As resort.0 Dim flags As Byte System Dim Leslie As flags.0 ' L/R toggle bit Dim CC6 As Byte ' leslie speed controller Dim automation As Word Dim CC69 As automation.0 ' 1 als cc69 > 0 Dim tg As automation.1 Dim NrNotes As automation.Byte1 ' 0 bij stilte - 60 bij full cluster ' anders aantal klinkende noten (255 max.) Dim LiPro As Byte ' light show prog. nr. Dim CC7 As Byte ' volume controller Dim CC10 As Byte ' panning controller Dim panfac1 As Float Dim panfac2 As Float Dim vol1 As Float Dim vol2 As Float Dim ivol1 As Word Dim ivol2 As Word Dim k As Float Dim j As Float '----------------------------------------------------------------------------------------- ' Load the USART Interrupt handler and buffer read subroutines into memory Dim Ringbuffer[256] As Byte ' Array for holding received characters Include "Pianet_Hub_Irq.inc" ' for UART,Timer0, Timer3 Interrupt ' velocity lookup table Dim Vels[128] As Word ' for Laukhuff solenoid Dim Dur[128] As Word ' duration lookup for lights flashing repetitions Dim Dur5[128] As Word ' lookup for Leslie speed Dim Trem[128] As Byte ' PWM lookup for the tremulant. ' this lookup can be used for tremolo on cc7 Dim Vol[128] As Word ' 10 bit pwm lookup for the Vactrol control in the VCA ' Main program starts here: MAIN: High Debug_Led DelayMS 10 ' wait for stability Low Debug_Led Low Power_Relay Low GreenLed Low PORTA.2 ' unused ports Low PORTA.3 Low PORTB.1 Low PORTB.3 Low PORTB.4 'HPWM 1, 0, fPwm ' RC2 8 bit 'HPWM 2, 0, fPwm ' RC1 8 bit OpenAnalog2 ' 10 bit OpenAnalog1 WriteAnalog2 0 WriteAnalog1 0 CC6 = 0 ' leslie speed OFF CC7 = Volume_default ' volume CC10 = 64 ' front-back panning panfac1 = 0.5 panfac2 = 0.5 vol1 = 0.0 vol2 = 0.0 Low Lite1 Low Lite2 Low Lite3 Low Lite4 HRSOut Control_Status, 30, 0 'reset repeats on cold boot Clear resort ' flag Clear notes Clear Leslie ' flag Set TimVals ' no timers running on startup Set CC69 ' automated lights on by default Clear NrNotes ' for lite automation Clear CC66 ' power off 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 ' 6.4 us per clock-tick 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 ' TIMER1: if enabled, all midi-in is blocked, so it must interfere with the UART ' Configure Timer1 for: ' Clear TMR1L and TMR1H registers ' Interrupt on Timer1 overflow ' 16-bit read/write mode ' Internal clock source ' 1:8 Prescaler ' OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_8) ' dit kompileert o.k. ' TIMER2: if enabled, the UART stops working... ' Opentimer2 (Timer_Int_On & T2_POST_1_16 & T2_PS_1_16) ' dit lukt... maar de timer is nodig voor de UART... ' TIMER3: ' Configure Timer3 for: ' Interrupt on Timer3 overflow ' 16-bit read/write mode ' Internal clock source ' 1:8 Prescaler ' Dont sync external clock input ' doing it this way seems to work: 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, freq.=19Hz ' Set up priority interrupts. ' IPR1bits_TMR1IP = 0 ' Set Timer1 as a low priority interrupt source ' INTCONbits_PEIE = 1 ' Enable peripheral interrupts ' INTCONbits_GIE = 1 ' Enable global interrupts GoSub Dur_Lookup GoSub Vels_Lookup GoSub Tremulant LiPro = LiPro_default ' start the main program loop: ' Create an infinite loop Do Cnt.Word0 = CntLw ' read timer 0 Bytein = GetMidiIn () ' procedure read data from the serial buffer, with no timeout ' Start the midi parser. Midi_Parse: If Bytein > Control_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. Else Clear statusbyte 'reset the status byte End If GoTo Check_Timers 'throw away... 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 statusbyte = Bytein Set notePres Set pres Case Control_Status ' controllers and switches statusbyte = Bytein Set Ctrl Set value Case ProgChange_Status ' used for registration statusbyte = Bytein Set prog Case Aftertouch_Status ' in version 2.0 used on this board 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 lowest_note To highest_note ' notes for Pianet HRSOut NoteOff_Status, noteUit, 0 If NrNotes > 0 Then Dec NrNotes ' for the lights... Set noteUit GoTo Check_Timers Case Lite0_note Clear Lite1 Clear notes.0 Set TimVals[0] Case Lite1_note Clear Lite2 Clear notes.1 Set TimVals[1] Case Lite2_note Clear Lite3 Clear notes.2 Set TimVals[2] Case Lite3_note Clear Lite4 Clear notes.3 Set TimVals[3] Case Lite4_note Clear OrangeRot Set noteUit GoTo Check_Timers Case Else Set noteUit GoTo Check_Timers EndSelect Set noteUit 'reset Set Resort_flag EndIf GoTo Check_Timers Case NoteOn_Status If noteAan = 255 Then noteAan = Bytein Else velo = Bytein Set Resort_flag If velo = 0 Then ' note off via velo=0 'set resort_flag Select noteAan Case lowest_note To highest_note HRSOut NoteOff_Status, noteAan, 0 'X-lat as noteoff!!! If NrNotes > 0 Then Dec NrNotes 'Set noteAan Clear Resort_flag Case Lite0_note Clear Lite1 Clear notes.0 Set TimVals[0] Case Lite1_note Clear Lite2 Clear notes.1 Set TimVals[1] Case Lite2_note Clear Lite3 Clear notes.2 Set TimVals[2] Case Lite3_note Clear Lite4 Clear notes.3 Set TimVals[3] Case Lite4_note Clear OrangeRot 'Set noteAan Clear Resort_flag Case Else 'Set noteAan Clear Resort_flag EndSelect Else If PowerOn = 1 Then ' dont do notes nor lights if power is off Select noteAan Case lowest_note To highest_note HRSOut NoteOn_Status, noteAan, velo Inc NrNotes ' this will cause a bug if note-on's ' are received without note-offs... 'Set noteAan Clear Resort_flag 'GoTo Check_Timers ' no resorting Case Lite0_note pres0 = velo ' need to store velo for the repeats Set Lite1 ' licht aan If pres0 < 127 Then ' pres0 is altijd > 0 Set notes.0 ' steers repeats TimVals[0] = Cnt + Dur[pres0] Else ' velo = 127 Clear notes.0 ' single stroke, no repeats Set TimVals[0] ' cancel timer EndIf Case Lite1_note pres1 = velo Set Lite2 If pres1 < 127 Then Set notes.1 TimVals[1] = Cnt + Dur[pres1] Else Clear notes.1 Set TimVals[1] EndIf Case Lite2_note pres2 = velo Set Lite3 If pres2 < 127 Then Set notes.2 TimVals[2] = Cnt + Dur[pres2] Else Clear notes.2 Set TimVals[2] EndIf Case Lite3_note pres3 = velo Set Lite4 If pres3 < 127 Then Set notes.3 TimVals[3] = Cnt + Dur[pres3] Else Clear notes.3 Set TimVals[3] EndIf Case Lite4_note Set OrangeRot ' no velo, no repeats 'Set noteAan Clear Resort_flag Case Else 'Set noteAan 'GoTo Check_Timers Clear Resort_flag EndSelect EndIf ' endif for power on EndIf ' endif for velo=0 or not Set noteAan EndIf Case Keypres_Status If notePres = 255 Then notePres = Bytein Else pres = Bytein KeyPres () ' midi out in the sub ' changing repetition rates requires timers! 'set resort_flag - not required here! 22.01.2024 EndIf Case Control_Status ' this is where the action takes place for controllers If Ctrl = 255 Then Ctrl = Bytein Else value = Bytein ' HRSOut Control_Status, Ctrl, value ' so all controllers are passed to midi out ' to be checked, as this may not be required ' at all. ' remmed here. Now controllers that are implemented are ' passed in the procedure: Controller () EndIf ' Case ProgChange_Status ' not implemented ' If prog = 255 Then 'single byte message ' prog = Bytein ' HRSOut ProgChange_Status, prog ' all prog changes passed ' Set prog ' EndIf ' Case Aftertouch_Status ' not used ' If aft = 255 Then ' aft = Bytein ' Aftertouch () ' EndIf ' Case Pitchbend_Status ' not used on this robot ' If pblsb = 255 Then ' pblsb = Bytein ' Else ' pbmsb = Bytein ' Pitchbend () ' EndIf EndSelect EndIf 'resort: If Resort_flag = 1 Then idx = SortTimers () ' so we resort only if an incoming midi command changed something EndIf Check_Timers: If idx < NrTasks Then ' we moeten alleen checken wanneer er een timer loopt If Cnt >= 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 ' note Lite0_note ' just toggle on/off If notes.0 = 0 Then ' no repeats required Clear Lite1 Set TimVals[0] Else ' repeat flag is set Toggle Lite1 TimVals[0] = Cnt + Dur[pres0] EndIf Case 1 If notes.1 = 0 Then Clear Lite2 Set TimVals[1] Else Toggle Lite2 TimVals[1] = Cnt + Dur[pres1] ' =Rate1 EndIf Case 2 If notes.2 = 0 Then Clear Lite3 Set TimVals[2] Else Toggle Lite3 TimVals[2] = Cnt + Dur[pres2] EndIf Case 3 If notes.3 = 0 Then Clear Lite4 Set TimVals[3] Else Toggle Lite4 TimVals[3] = Cnt + Dur[pres3] EndIf Case 4 'Leslie speed control If Leslie = 0 Then ivol1 = Vol[CC7] ivol2 = 0 Else ivol1 = 0 ivol2 = Vol[CC7] EndIf Toggle Leslie TimVals[4] = Cnt + Dur5[CC6] WriteAnalog1 ivol1 WriteAnalog2 ivol2 'Case Else ' ' in dit geval is idx geset ' GoTo jumpout EndSelect idx = SortTimers () ' find a new nxt and idx EndIf ' beveiliging tegen overflow crashes... If maxtim = 1 Then Clear Cnt Clear notes Set TimVals EndIf Else ' idx > NrTasks, no timers running, so to avoid overflows, we can reset the loop timer If maxtim = 1 Then Clear Cnt ' 16.06.2015 EndIf 'Auto_Lights: ' ' for automated lights ' to be added on pianet as well. This is still the algo for ''If Cnt.9 = tg Then ' period is then 11ms If Cnt.11 = tg Then ' could even be cnt.11 (46ms or 21Hz) Btg tg If CC69 = 1 Then ' here we have a selection of different light programs. ' if we make cc69 a byte, it would be easy. ' Solved by introducing a variable LiPro, set on reception of ' a controller 69 command. Select LiPro ' kan niet 0 zijn, want dan is CC69 ook 0 Case 1 If NrNotes > 0 Then Set Lite4 Else Clear Lite4 EndIf Case 2 If NrNotes > 0 Then Set Lite2 Else Clear Lite2 EndIf Case 3 If NrNotes > 0 Then Set Lite2 Set Lite4 Else Clear Lite2 Clear Lite4 EndIf Case 4 If NrNotes > 0 Then If tg = 0 Then Clear Lite2 Set Lite4 Else Set Lite2 Clear Lite4 EndIf Else Clear Lite2 Clear Lite4 EndIf Case 5 i = Ncd NrNotes Select i Case 0 Clear Lite4 Clear Lite3 Clear Lite2 Clear Lite1 Clear OrangeRot Case 1 ' 1 note playing Set Lite4 Clear Lite3 Clear Lite2 Clear Lite1 Case 2 ' 2 or 3 notes playing Set Lite4 Set Lite3 Set Lite2 Clear Lite1 Case 3 ' case 3 = 4 to 7 notes playing Set Lite4 Set Lite3 Set Lite2 Set Lite1 Case 4 ' case 4 = 8 to 15 notes. Set Lite4 Set Lite3 Set Lite2 Set Lite1 Set OrangeRot EndSelect Case 6 Lite4 = NrNotes.0 Lite2 = NrNotes.1 Lite3 = NrNotes.2 Lite1 = NrNotes.2 Case 7 Lite2 = NrNotes.0 Lite1 = NrNotes.1 Lite3 = NrNotes.2 Lite4 = NrNotes.2 Case 8 If NrNotes = 0 Then Clear OrangeRot Else Set OrangeRot EndIf ' case else ' what do we do? ' or should we make this impossible? ' --> done by ceiling LiPro to 8 EndSelect EndIf EndIf Btg PORTB.0 ' Version 2.0: ' 29.01.2024: for now 81 kHz Loop Proc SortTimers (), Byte 'look up the next smallest timer value in the Timvals array ' zoek de de volgende kleinste timer waarde: Set Result Set Nxt.31 Clear i Do If TimVals[i] < Nxt Then Nxt = TimVals[i] Result = i EndIf Inc i Loop Until i > LastTask Clear Resort_flag EndProc Proc KeyPres () Select notePres Case lowest_note To highest_note HRSOut Keypres_Status, notePres, pres ' used for autorepeats Case Lite0_note ' should program the repetition rate - notes.0 flag pres0 = pres Case Lite1_note pres1 = pres Case Lite2_note pres2 = pres Case Lite3_note pres3 = pres EndSelect ' we do not need to resort here Set notePres EndProc 'Proc ProgChange () ' HRSOut ProgChange_Status, prog ' Set prog ' ' this is used to change the different registers this organ has. 'Return 'Proc Pitchbend () ' ' not implemented. ' Set pblsb 'Return 'Proc Aftertouch () ' 'this is the channel aftertouch, affecting any playing note ' ' not implemented on Pianet ' Set aft 'Return Proc Controller () Select Ctrl Case 6 ' amplitude modulation speed [leslie speed, front back speaker] CC6 = value ' we start with panning in the center: If CC6 > 0 Then ivol1 = Vol[CC7] ivol2 = Vol[CC7] TimVals[4] = Cnt + Dur5[CC6] Else ' leslie OFF vol1 = Vol[CC7] * panfac1 vol2 = Vol[CC7] * panfac2 ivol1 = vol1 ivol2 = vol2 Set TimVals[4] EndIf WriteAnalog1 ivol1 WriteAnalog2 ivol2 Set Resort_flag Case 7 ' volume controller ' via optors on Pianet amp board. ' 8-bit coding: ' If value = 0 Then ' CC7 = 0 ' Else ' CC7 = value << 1 ' CC7 = CC7 + 1 ' 254 wordt 255 ' EndIf ' vol1 = CC7 * panfac1 ' vol2 = CC7 * panfac2 ' HPWM 1, vol1, fPwm ' via optor ' HPWM 2, vol2, fPwm ' code for 10-bit PWM: CC7 = value vol1 = Vol[value] * panfac1 ' needs 10-bit lookup table. vol2 = Vol[value] * panfac2 ivol1 = vol1 ivol2 = vol2 WriteAnalog1 ivol1 WriteAnalog2 ivol2 Case 10 CC10 = value ' CC10 default = 64 panfac1 = CC10 /127.0 panfac2 = (1.0 - panfac1) vol1 = Vol[CC7] * panfac1 vol2 = Vol[CC7] * panfac2 ivol1 = vol1 ivol2 = vol2 WriteAnalog1 ivol1 WriteAnalog2 ivol2 Case 30 ' used for global repeat frequency pres0 = value pres1 = value pres2 = value pres3 = value HRSOut Control_Status, 30, value Case 66 ' on/off for the robot ' this should also go to the note boards! If value = 0 Then PowerDown () Else PowerUp () EndIf ResetControllers () HRSOut Control_Status, 66, value HRSOut Control_Status, 30, 0 ' make sure we reset autorepeats. Case 69 If value > 0 Then Set CC69 ' lights automation ON Else Clear CC69 ' automation OFF EndIf Clear NrNotes ' so, we allways reset! Clear Lite1 Clear Lite2 Clear Lite3 Clear Lite4 Clear OrangeRot Set TimVals[0] Set TimVals[1] Set TimVals[2] Set TimVals[3] LiPro = value ' 0=off, 1-127=prog.nr. If LiPro > 8 Then LiPro = 8 ' ceiling! Case 123 ' all notes off - no controller resets Clear notes Clear Lite1 Clear Lite2 Clear Lite3 Clear OrangeRot Clear Lite4 Clear NrNotes Set TimVals ' also switches leslie off! Set Resort_flag HRSOut Control_Status, 123, 0 EndSelect Set Ctrl 'mandatory reset EndProc Proc PowerDown () Clear Power_Relay Clear GreenLed Clear notes Clear pres0 Clear pres1 Clear pres2 Clear pres3 Clear Lite1 Clear Lite2 Clear Lite3 Clear Lite4 Clear OrangeRot Clear NrNotes 'set Timvals 'set Resort_Flag Clear PowerOn EndProc Proc PowerUp () Set Power_Relay Set GreenLed 'Set Timvals 'Set Resort_Flag Set PowerOn ' CC66.0 =1 EndProc Proc ResetControllers () CC7 = Volume_default Clear CC6 CC10 = 64 WriteAnalog1 0 WriteAnalog2 0 LiPro = LiPro_default Set TimVals Set Resort_flag panfac1 = 0.5 panfac2 = 0.5 Set CC69 EndProc Dur_Lookup: 'lookup for light repeats: '1 : 20 range, calculated 21.05.2021 Dur[0]= 32768 Dur[1]= 32000 ' freq= 0.63 Dur[2]= 30525 ' freq= 0.66 Dur[3]= 29814 ' freq= 0.67 Dur[4]= 29118 ' freq= 0.69 Dur[5]= 28440 ' freq= 0.7 Dur[6]= 27777 ' freq= 0.72 Dur[7]= 27129 ' freq= 0.74 Dur[8]= 26497 ' freq= 0.75 Dur[9]= 25879 ' freq= 0.77 Dur[10]= 25276 ' freq= 0.79 Dur[11]= 24686 ' freq= 0.81 Dur[12]= 24111 ' freq= 0.83 Dur[13]= 23549 ' freq= 0.85 Dur[14]= 23000 ' freq= 0.87 Dur[15]= 22464 ' freq= 0.89 Dur[16]= 21940 ' freq= 0.91 Dur[17]= 21428 ' freq= 0.93 Dur[18]= 20929 ' freq= 0.96 Dur[19]= 20441 ' freq= 0.98 Dur[20]= 19964 ' freq= 1. Dur[21]= 19499 ' freq= 1.03 Dur[22]= 19044 ' freq= 1.05 Dur[23]= 18600 ' freq= 1.08 Dur[24]= 18167 ' freq= 1.1 Dur[25]= 17743 ' freq= 1.13 Dur[26]= 17330 ' freq= 1.15 Dur[27]= 16926 ' freq= 1.18 Dur[28]= 16531 ' freq= 1.21 Dur[29]= 16146 ' freq= 1.24 Dur[30]= 15769 ' freq= 1.27 Dur[31]= 15402 ' freq= 1.3 Dur[32]= 15043 ' freq= 1.33 Dur[33]= 14692 ' freq= 1.36 Dur[34]= 14349 ' freq= 1.39 Dur[35]= 14015 ' freq= 1.43 Dur[36]= 13688 ' freq= 1.46 Dur[37]= 13369 ' freq= 1.5 Dur[38]= 13057 ' freq= 1.53 Dur[39]= 12753 ' freq= 1.57 Dur[40]= 12456 ' freq= 1.61 Dur[41]= 12165 ' freq= 1.64 Dur[42]= 11882 ' freq= 1.68 Dur[43]= 11605 ' freq= 1.72 Dur[44]= 11334 ' freq= 1.76 Dur[45]= 11070 ' freq= 1.81 Dur[46]= 10812 ' freq= 1.85 Dur[47]= 10560 ' freq= 1.89 Dur[48]= 10314 ' freq= 1.94 Dur[49]= 10073 ' freq= 1.99 Dur[50]= 9838 ' freq= 2.03 Dur[51]= 9609 ' freq= 2.08 Dur[52]= 9385 ' freq= 2.13 Dur[53]= 9166 ' freq= 2.18 Dur[54]= 8952 ' freq= 2.23 Dur[55]= 8744 ' freq= 2.29 Dur[56]= 8540 ' freq= 2.34 Dur[57]= 8341 ' freq= 2.4 Dur[58]= 8146 ' freq= 2.46 Dur[59]= 7956 ' freq= 2.51 Dur[60]= 7771 ' freq= 2.57 Dur[61]= 7590 ' freq= 2.64 Dur[62]= 7413 ' freq= 2.7 Dur[63]= 7240 ' freq= 2.76 Dur[64]= 7071 ' freq= 2.83 Dur[65]= 6906 ' freq= 2.9 Dur[66]= 6745 ' freq= 2.96 Dur[67]= 6588 ' freq= 3.04 Dur[68]= 6435 ' freq= 3.11 Dur[69]= 6285 ' freq= 3.18 Dur[70]= 6138 ' freq= 3.26 Dur[71]= 5995 ' freq= 3.34 Dur[72]= 5855 ' freq= 3.42 Dur[73]= 5719 ' freq= 3.5 Dur[74]= 5585 ' freq= 3.58 Dur[75]= 5455 ' freq= 3.67 Dur[76]= 5328 ' freq= 3.75 Dur[77]= 5204 ' freq= 3.84 Dur[78]= 5082 ' freq= 3.94 Dur[79]= 4964 ' freq= 4.03 Dur[80]= 4848 ' freq= 4.12 Dur[81]= 4735 ' freq= 4.22 Dur[82]= 4625 ' freq= 4.32 Dur[83]= 4517 ' freq= 4.43 Dur[84]= 4412 ' freq= 4.53 Dur[85]= 4309 ' freq= 4.64 Dur[86]= 4208 ' freq= 4.75 Dur[87]= 4110 ' freq= 4.87 Dur[88]= 4014 ' freq= 4.98 Dur[89]= 3921 ' freq= 5.1 Dur[90]= 3829 ' freq= 5.22 Dur[91]= 3740 ' freq= 5.35 Dur[92]= 3653 ' freq= 5.47 Dur[93]= 3568 ' freq= 5.61 Dur[94]= 3485 ' freq= 5.74 Dur[95]= 3403 ' freq= 5.88 Dur[96]= 3324 ' freq= 6.02 Dur[97]= 3247 ' freq= 6.16 Dur[98]= 3171 ' freq= 6.31 Dur[99]= 3097 ' freq= 6.46 Dur[100]= 3025 ' freq= 6.61 Dur[101]= 2954 ' freq= 6.77 Dur[102]= 2885 ' freq= 6.93 Dur[103]= 2818 ' freq= 7.1 Dur[104]= 2752 ' freq= 7.27 Dur[105]= 2688 ' freq= 7.44 Dur[106]= 2625 ' freq= 7.62 Dur[107]= 2564 ' freq= 7.8 Dur[108]= 2504 ' freq= 7.99 Dur[109]= 2446 ' freq= 8.17 Dur[110]= 2389 ' freq= 8.37 Dur[111]= 2333 ' freq= 8.57 Dur[112]= 2279 ' freq= 8.78 Dur[113]= 2226 ' freq= 8.98 Dur[114]= 2174 ' freq= 9.2 Dur[115]= 2123 ' freq= 9.42 Dur[116]= 2074 ' freq= 9.64 Dur[117]= 2025 ' freq= 9.87 Dur[118]= 1978 ' freq= 10.11 Dur[119]= 1932 ' freq= 10.35 Dur[120]= 1887 ' freq= 10.6 Dur[121]= 1843 ' freq= 10.85 Dur[122]= 1800 ' freq= 11.11 Dur[123]= 1758 ' freq= 11.37 Dur[124]= 1717 ' freq= 11.64 Dur[125]= 1677 ' freq= 11.92 Dur[126]= 1638 ' freq= 12.21 Dur[127]= 1600 ' freq= 12.5 'recalculated 20.05.2021 'Dur[1]= 32000 ' freq= .625000015788828 'Dur[2]= 30860 ' freq= .648077656073055 'Dur[3]= 30306 ' freq= .659935343009388 'Dur[4]= 29761 ' freq= .672009156300674 'Dur[5]= 29226 ' freq= .68431048894813 'Dur[6]= 28701 ' freq= .696827709535826 'Dur[7]= 28186 ' freq= .709572145932112 'Dur[8]= 27679 ' freq= .722556422812641 'Dur[9]= 27182 ' freq= .735781050152399 'Dur[10]= 26694 ' freq= .749232056089103 'Dur[11]= 26214 ' freq= .762951114108587 'Dur[12]= 25743 ' freq= .776910247649556 'Dur[13]= 25280 ' freq= .791123613268824 'Dur[14]= 24826 ' freq= .805590820503998 'Dur[15]= 24380 ' freq= .820327741647731 'Dur[16]= 23942 ' freq= .835334677048867 'Dur[17]= 23512 ' freq= .850629487293404 'Dur[18]= 23089 ' freq= .866194612496698 'Dur[19]= 22675 ' freq= .882028688213562 'Dur[20]= 22267 ' freq= .898170001358146 'Dur[21]= 21867 ' freq= .914599314290271 'Dur[22]= 21474 ' freq= .931337190865562 'Dur[23]= 21088 ' freq= .948384214393746 'Dur[24]= 20709 ' freq= .965740385100679 'Dur[25]= 20337 ' freq= .983405064793731 'Dur[26]= 19972 ' freq= 1.00140198804539 'Dur[27]= 19613 ' freq= 1.01970584063234 'Dur[28]= 19261 ' freq= 1.03836771222899 'Dur[29]= 18915 ' freq= 1.05736190881536 'Dur[30]= 18575 ' freq= 1.07671604335088 'Dur[31]= 18241 ' freq= 1.09640109120645 'Dur[32]= 17913 ' freq= 1.11647642868465 'Dur[33]= 17591 ' freq= 1.13691274224725 'Dur[34]= 17275 ' freq= 1.15770892334477 'Dur[35]= 16965 ' freq= 1.17889776040333 'Dur[36]= 16660 ' freq= 1.20044419466658 'Dur[37]= 16361 ' freq= 1.22241919841345 'Dur[38]= 16067 ' freq= 1.24478748398846 'Dur[39]= 15778 ' freq= 1.26754764427813 'Dur[40]= 15495 ' freq= 1.29073898065457 'Dur[41]= 15216 ' freq= 1.31436273159022 'Dur[42]= 14943 ' freq= 1.3384193605864 'Dur[43]= 14674 ' freq= 1.36290848105506 'Dur[44]= 14411 ' freq= 1.38782877699275 'Dur[45]= 14152 ' freq= 1.41322784802448 'Dur[46]= 13898 ' freq= 1.43905601563121 'Dur[47]= 13648 ' freq= 1.46541621521413 'Dur[48]= 13403 ' freq= 1.49220327577725 'Dur[49]= 13162 ' freq= 1.51952594630318 'Dur[50]= 12925 ' freq= 1.54732896253472 'Dur[51]= 12693 ' freq= 1.5756096037533 'Dur[52]= 12465 ' freq= 1.60442826242369 'Dur[53]= 12241 ' freq= 1.63378675041804 'Dur[54]= 12021 ' freq= 1.66368593813106 'Dur[55]= 11805 ' freq= 1.69412566221189 'Dur[56]= 11593 ' freq= 1.72517903090162 'Dur[57]= 11385 ' freq= 1.75669745324923 'Dur[58]= 11180 ' freq= 1.78882880955615 'Dur[59]= 10979 ' freq= 1.82157662054215 'Dur[60]= 10782 ' freq= 1.85494347108537 'Dur[61]= 10588 ' freq= 1.88884171556335 'Dur[62]= 10398 ' freq= 1.92335437853945 'Dur[63]= 10211 ' freq= 1.95857616464207 'Dur[64]= 10028 ' freq= 1.99441568660177 'Dur[65]= 9848 ' freq= 2.03086926332682 'Dur[66]= 9671 ' freq= 2.0680385177585 'Dur[67]= 9497 ' freq= 2.10592824104902 'Dur[68]= 9326 ' freq= 2.14442722406503 'Dur[69]= 9159 ' freq= 2.18364455783846 'Dur[70]= 8994 ' freq= 2.22358113349742 'Dur[71]= 8832 ' freq= 2.26436461989726 'Dur[72]= 8674 ' freq= 2.30574135407453 'Dur[73]= 8518 ' freq= 2.3479690661238 'Dur[74]= 8365 ' freq= 2.39091458520532 'Dur[75]= 8215 ' freq= 2.4345709683801 'Dur[76]= 8067 ' freq= 2.47923645782106 'Dur[77]= 7922 ' freq= 2.52445572802051 'Dur[78]= 7780 ' freq= 2.5706941523448 'Dur[79]= 7640 ' freq= 2.61780111325164 'Dur[80]= 7503 ' freq= 2.6656004938348 'Dur[81]= 7368 ' freq= 2.71444089376256 'Dur[82]= 7235 ' freq= 2.76414905745871 'Dur[83]= 7105 ' freq= 2.81472106188762 'Dur[84]= 6978 ' freq= 2.86615083193501 'Dur[85]= 6852 ' freq= 2.91864290481467 'Dur[86]= 6729 ' freq= 2.97198907871944 'Dur[87]= 6608 ' freq= 3.02640546345502 'Dur[88]= 6490 ' freq= 3.08166417646264 'Dur[89]= 6373 ' freq= 3.13799333258688 'Dur[90]= 6259 ' freq= 3.19539870670115 'Dur[91]= 6146 ' freq= 3.2538844066123 'Dur[92]= 6036 ' freq= 3.31345270133242 'Dur[93]= 5927 ' freq= 3.37410383892746 'Dur[94]= 5821 ' freq= 3.43583585384685 'Dur[95]= 5716 ' freq= 3.4986443637265 'Dur[96]= 5613 ' freq= 3.56283967315267 'Dur[97]= 5513 ' freq= 3.62778895433385 'Dur[98]= 5413 ' freq= 3.69446762819664 'Dur[99]= 5316 ' freq= 3.76187350799257 'Dur[100]= 5221 ' freq= 3.83068387382542 'Dur[101]= 5127 ' freq= 3.90091681397357 'Dur[102]= 5035 ' freq= 3.97219473788332 'Dur[103]= 4944 ' freq= 4.04489847411114 'Dur[104]= 4855 ' freq= 4.11904036767429 'Dur[105]= 4768 ' freq= 4.1941911513563 'Dur[106]= 4683 ' freq= 4.27076671049381 'Dur[107]= 4598 ' freq= 4.34924442867076 'Dur[108]= 4516 ' freq= 4.42869807467726 'Dur[109]= 4435 ' freq= 4.50958297750677 'Dur[110]= 4355 ' freq= 4.59242261888462 'Dur[111]= 4277 ' freq= 4.67617500707096 'Dur[112]= 4200 ' freq= 4.7619048822006 'Dur[113]= 4124 ' freq= 4.84907273736029 'Dur[114]= 4050 ' freq= 4.93766214177077 'Dur[115]= 3978 ' freq= 5.02765221348479 'Dur[116]= 3906 ' freq= 5.11967247030398 'Dur[117]= 3836 ' freq= 5.2137644695627 'Dur[118]= 3767 ' freq= 5.30926480096695 'Dur[119]= 3699 ' freq= 5.40613610088999 'Dur[120]= 3633 ' freq= 5.50509234936485 'Dur[121]= 3567 ' freq= 5.6061669250855 'Dur[122]= 3503 ' freq= 5.70857728135936 'Dur[123]= 3440 ' freq= 5.81310870665383 'Dur[124]= 3379 ' freq= 5.91891106991492 'Dur[125]= 3318 ' freq= 6.0277276989881 'Dur[126]= 3258 ' freq= 6.13779361830367 'Dur[127]= 3200 ' freq= 6.25000015788828 'Set Dur[0] ' not used for HybrLo '' durations for note repetition on Chi '' the dur values are for a half period ! '' the frequencies are for the full period. '' on Flex-Pi/e-saw used for the beater repeats 'Dur[1]= 23674 ' freq= 2.11202162710146 'Dur[2]= 22917 ' freq= 2.18178644674259 '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 ' freq= 4.31667098333765 '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 ' freq= 5.87751263665217 'Dur[64]= 8370 ' freq= 5.973715651135 '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 ' freq= 9.88533017002768 'Dur[96]= 4977 ' freq= 10.0462125778581 'Dur[97]= 4897 ' freq= 10.2103328568511 'Dur[98]= 4818 ' freq= 10.3777501037775 'Dur[99]= 4740 ' freq= 10.548523206751 'Dur[100]= 4664 ' freq= 10.7204116638079 'Dur[101]= 4589 ' freq= 10.8956199607758 'Dur[102]= 4515 ' freq= 11.0741971207087 'Dur[103]= 4442 ' freq= 11.2561909049977 'Dur[104]= 4370 ' freq= 11.441647597254 'Dur[105]= 4300 ' freq= 11.6279069767442 'Dur[106]= 4231 ' freq= 11.8175372252422 'Dur[107]= 4162 ' freq= 12.013455069678 'Dur[108]= 4095 ' freq= 12.2100122100122 'Dur[109]= 4029 ' freq= 12.4100273020601 'Dur[110]= 3964 ' freq= 12.6135216952573 'Dur[111]= 3901 ' freq= 12.8172263522174 'Dur[112]= 3838 ' freq= 13.0276185513288 'Dur[113]= 3776 ' freq= 13.2415254237288 'Dur[114]= 3715 ' freq= 13.4589502018842 'Dur[115]= 3655 ' freq= 13.6798905608755 'Dur[116]= 3596 ' freq= 13.9043381535039 'Dur[117]= 3538 ' freq= 14.1322781232335 'Dur[118]= 3481 ' freq= 14.3636885952312 'Dur[119]= 3425 ' freq= 14.5985401459854 'Dur[120]= 3370 ' freq= 14.8367952522255 'Dur[121]= 3316 ' freq= 15.0784077201448 'Dur[122]= 3262 ' freq= 15.3280196198651 'Dur[123]= 3210 ' freq= 15.5763239875389 'Dur[124]= 3158 ' freq= 15.8328055731476 'Dur[125]= 3107 ' freq= 16.0926939169617 'Dur[126]= 3057 ' freq= 16.3559044815178 'Dur[127]= 3008 ' freq= 16.6223404255319 ''old lookup for flashing lights: ' we can try this one for the Leslie on Pianet Set Dur5[0] Dur5[1]= 41667 ' freq= .999992000063999 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 ' freq= 29.9976001919846 Return Vels_Lookup: ' velo lookup scale for Laukhuff solenoid. Logarithmic ' Vels_Lookup_Laukhuff: ' used in Flex for the beaters Vels[1]= 1160 ' duur= .0116 Vels[2]= 1190 ' duur= .0119 Vels[3]= 1206 ' duur= .01206 Vels[4]= 1222 ' duur= .01222 Vels[5]= 1238 ' duur= .01238 Vels[6]= 1254 ' duur= .01254 Vels[7]= 1270 ' duur= .0127 Vels[8]= 1287 ' duur= .01287 Vels[9]= 1303 ' duur= .01303 Vels[10]= 1320 ' duur= .0132 Vels[11]= 1337 ' duur= .01337 Vels[12]= 1355 ' duur= .01355 Vels[13]= 1373 ' duur= .01373 Vels[14]= 1390 ' duur= .0139 Vels[15]= 1408 ' duur= .01408 Vels[16]= 1427 ' duur= .01427 Vels[17]= 1445 ' duur= .01445 Vels[18]= 1464 ' duur= .01464 Vels[19]= 1483 ' duur= .01483 Vels[20]= 1503 ' duur= .01503 Vels[21]= 1522 ' duur= .01522 Vels[22]= 1542 ' duur= .01542 Vels[23]= 1562 ' duur= .01562 Vels[24]= 1582 ' duur= .01582 Vels[25]= 1603 ' duur= .01603 Vels[26]= 1624 ' duur= .01624 Vels[27]= 1645 ' duur= .01645 Vels[28]= 1667 ' duur= .01667 Vels[29]= 1688 ' duur= .01688 Vels[30]= 1710 ' duur= .0171 Vels[31]= 1732 ' duur= .01732 Vels[32]= 1755 ' duur= .01755 Vels[33]= 1778 ' duur= .01778 Vels[34]= 1801 ' duur= .01801 Vels[35]= 1825 ' duur= .01825 Vels[36]= 1848 ' duur= .01848 Vels[37]= 1872 ' duur= .01872 Vels[38]= 1897 ' duur= .01897 Vels[39]= 1921 ' duur= .01921 Vels[40]= 1946 ' duur= .01946 Vels[41]= 1972 ' duur= .01972 Vels[42]= 1997 ' duur= .01997 Vels[43]= 2023 ' duur= .02023 Vels[44]= 2050 ' duur= .0205 Vels[45]= 2077 ' duur= .02077 Vels[46]= 2104 ' duur= .02104 Vels[47]= 2131 ' duur= .02131 Vels[48]= 2159 ' duur= .02159 Vels[49]= 2187 ' duur= .02187 Vels[50]= 2215 ' duur= .02215 Vels[51]= 2244 ' duur= .02244 Vels[52]= 2273 ' duur= .02273 Vels[53]= 2303 ' duur= .02303 Vels[54]= 2333 ' duur= .02333 Vels[55]= 2363 ' duur= .02363 Vels[56]= 2394 ' duur= .02394 Vels[57]= 2425 ' duur= .02425 Vels[58]= 2457 ' duur= .02457 Vels[59]= 2489 ' duur= .02489 Vels[60]= 2521 ' duur= .02521 Vels[61]= 2554 ' duur= .02554 Vels[62]= 2587 ' duur= .02587 Vels[63]= 2621 ' duur= .02621 Vels[64]= 2655 ' duur= .02655 Vels[65]= 2690 ' duur= .0269 Vels[66]= 2725 ' duur= .02725 Vels[67]= 2760 ' duur= .0276 Vels[68]= 2796 ' duur= .02796 Vels[69]= 2833 ' duur= .02833 Vels[70]= 2870 ' duur= .0287 Vels[71]= 2907 ' duur= .02907 Vels[72]= 2945 ' duur= .02945 Vels[73]= 2983 ' duur= .02983 Vels[74]= 3022 ' duur= .03022 Vels[75]= 3061 ' duur= .03061 Vels[76]= 3101 ' duur= .03101 Vels[77]= 3142 ' duur= .03142 Vels[78]= 3183 ' duur= .03183 Vels[79]= 3224 ' duur= .03224 Vels[80]= 3266 ' duur= .03266 Vels[81]= 3309 ' duur= .03309 Vels[82]= 3352 ' duur= .03352 Vels[83]= 3395 ' duur= .03395 Vels[84]= 3440 ' duur= .0344 Vels[85]= 3484 ' duur= .03484 Vels[86]= 3530 ' duur= .0353 Vels[87]= 3576 ' duur= .03576 Vels[88]= 3622 ' duur= .03622 Vels[89]= 3669 ' duur= .03669 Vels[90]= 3717 ' duur= .03717 Vels[91]= 3766 ' duur= .03766 Vels[92]= 3815 ' duur= .03815 Vels[93]= 3864 ' duur= .03864 Vels[94]= 3915 ' duur= .03915 Vels[95]= 3966 ' duur= .03966 Vels[96]= 4017 ' duur= .04017 Vels[97]= 4070 ' duur= .0407 Vels[98]= 4123 ' duur= .04123 Vels[99]= 4176 ' duur= .04176 Vels[100]= 4231 ' duur= .04231 Vels[101]= 4286 ' duur= .04286 Vels[102]= 4342 ' duur= .04342 Vels[103]= 4398 ' duur= .04398 Vels[104]= 4456 ' duur= .04456 Vels[105]= 4514 ' duur= .04514 Vels[106]= 4572 ' duur= .04572 Vels[107]= 4632 ' duur= .04632 Vels[108]= 4692 ' duur= .04692 Vels[109]= 4753 ' duur= .04753 Vels[110]= 4815 ' duur= .04815 Vels[111]= 4878 ' duur= .04878 Vels[112]= 4941 ' duur= .04941 Vels[113]= 5006 ' duur= .05006 Vels[114]= 5071 ' duur= .05071 Vels[115]= 5137 ' duur= .05137 Vels[116]= 5204 ' duur= .05204 Vels[117]= 5272 ' duur= .05272 Vels[118]= 5340 ' duur= .0534 Vels[119]= 5410 ' duur= .0541 Vels[120]= 5480 ' duur= .0548 Vels[121]= 5552 ' duur= .05552 Vels[122]= 5624 ' duur= .05624 Vels[123]= 5697 ' duur= .05697 Vels[124]= 5772 ' duur= .05772 Vels[125]= 5847 ' duur= .05847 Vels[126]= 5923 ' duur= .05923 Vels[127]= 6000 ' duur= .06 Return Tremulant: 'Lookup table for the tremulant periods in 8-bit PWM 'formula: y = SQR(x) * SQR(128) * 2 '13.05.2021: very good scaling! (on ) ' not used for pianet. Trem[0]= 0 Trem[1]= 23 Trem[2]= 32 Trem[3]= 39 Trem[4]= 45 Trem[5]= 51 Trem[6]= 55 Trem[7]= 60 Trem[8]= 64 Trem[9]= 68 Trem[10]= 72 Trem[11]= 75 Trem[12]= 78 Trem[13]= 82 Trem[14]= 85 Trem[15]= 88 Trem[16]= 91 Trem[17]= 93 Trem[18]= 96 Trem[19]= 99 Trem[20]= 101 Trem[21]= 104 Trem[22]= 106 Trem[23]= 109 Trem[24]= 111 Trem[25]= 113 Trem[26]= 115 Trem[27]= 118 Trem[28]= 120 Trem[29]= 122 Trem[30]= 124 Trem[31]= 126 Trem[32]= 128 Trem[33]= 130 Trem[34]= 132 Trem[35]= 134 Trem[36]= 136 Trem[37]= 138 Trem[38]= 139 Trem[39]= 141 Trem[40]= 143 Trem[41]= 145 Trem[42]= 147 Trem[43]= 148 Trem[44]= 150 Trem[45]= 152 Trem[46]= 153 Trem[47]= 155 Trem[48]= 157 Trem[49]= 158 Trem[50]= 160 Trem[51]= 162 Trem[52]= 163 Trem[53]= 165 Trem[54]= 166 Trem[55]= 168 Trem[56]= 169 Trem[57]= 171 Trem[58]= 172 Trem[59]= 174 Trem[60]= 175 Trem[61]= 177 Trem[62]= 178 Trem[63]= 180 Trem[64]= 181 Trem[65]= 182 Trem[66]= 184 Trem[67]= 185 Trem[68]= 187 Trem[69]= 188 Trem[70]= 189 Trem[71]= 191 Trem[72]= 192 Trem[73]= 193 Trem[74]= 195 Trem[75]= 196 Trem[76]= 197 Trem[77]= 199 Trem[78]= 200 Trem[79]= 201 Trem[80]= 202 Trem[81]= 204 Trem[82]= 205 Trem[83]= 206 Trem[84]= 207 Trem[85]= 209 Trem[86]= 210 Trem[87]= 211 Trem[88]= 212 Trem[89]= 213 Trem[90]= 215 Trem[91]= 216 Trem[92]= 217 Trem[93]= 218 Trem[94]= 219 Trem[95]= 221 Trem[96]= 222 Trem[97]= 223 Trem[98]= 224 Trem[99]= 225 Trem[100]= 226 Trem[101]= 227 Trem[102]= 229 Trem[103]= 230 Trem[104]= 231 Trem[105]= 232 Trem[106]= 233 Trem[107]= 234 Trem[108]= 235 Trem[109]= 236 Trem[110]= 237 Trem[111]= 238 Trem[112]= 239 Trem[113]= 241 Trem[114]= 242 Trem[115]= 243 Trem[116]= 244 Trem[117]= 245 Trem[118]= 246 Trem[119]= 247 Trem[120]= 248 Trem[121]= 249 Trem[122]= 250 Trem[123]= 251 Trem[124]= 252 Trem[125]= 253 Trem[126]= 254 Trem[127]= 255 Volume_Lookup: ' voorlopige lineaire scaling!!! ' voor pianet, 10 bit resolutie. 'Vol[0] = 0 'For i = 1 To 127 ' Vol[i] = Vol[i-1] + 8 'Next i 'Vol[127] = 1023 ' veel betere exponential scaling: [29.01.2024] For i = 0 To 127 k = i / 12.7 j = Pow (2.0, k) ' = 2 ^ k in PowerBasic Vol[i] = j If Vol[i] > 1023 Then Vol[i] = 1023 Next i Return '[EOF]