HAWK-800HAWK-800HA-832HAWK-800AtomaHawkEX-800

HAWK-832 Project Progress Updates

Below are the progress updates for the HA-832 project. Check back regularly to see new updates.

March 24th 2024 - Note On/Off and MIDI Reception

I made progress with note on and note off actions (in Poly assign mode only) and Poly mode note on/off is now working. What a pain that was! The piano register scanner is written and implemented but not yet tested. But basic MIDI input reception is done and MIDI note on/off actions are completed and tested. The MIDI input code is now ready for implementation of pitch bend, controllers and real time messages as well. MIDI program change is complete. Additional progress was made with the envelope generators. I was able to implement "decay to zero" when note off occurs in the attack or decay phases (instead of using the sustain release setting). This gives added realism and flexibility to the envelopes. Speed was also improved yet again. So that now, the envelope generators are behaving much better than the original Poly-800. This is all because of the added power available with the STM32 processor.

March 10th 2024 - General 80C85 Buss, MIDI Reception and Performance Discussion

Below are three tables that provide some insight into the performance characteristics of MIDI, the 80C85 buss and the current main line code in the HAWK-832 project. The first table shows how long it takes to receive a MIDI note on event (with no running status). It takes a tad over a millisecond. The next table shows how fast the STM32 can write to or read from the 80C85 buss hardware. It takes 4 microseconds. The third table shows the number of 80C85 read/write instructions that occur during the main line loop in the current HAWK-832 software. At the moment, it's just 7 instructions. 7 x 4 = 28uS. This is important because the stm32 needs to have enough time to react to incoming MIDI, keyboard and joystick input, and send envelope, tone generator and MIDI out - fast. The faster the better so that the envelope generators can have very fast note onset timings. These calculations show that there is a large amount of available CPU and buss performance headroom. It is important to note that the stm32 has to wait for accesses to/from the 80C85 buss to complete before returning back to normal operations. So although the stm32 executes instructions in nanoseconds, it has to wait 28uS in each iteration of the main loop. Fortunately, the intervening gaps in between buss access allow for the stm32 to operate at full execution speed, so there is little impact on normal operations. However, these performance parameters are very important when dealing with the critical note onset phase and high rising rates in the envelope generator phases (attack, decay etc). With the calculations set out below, the main line code is able to react to note onset within 28uS which is very much faster than the approximate 1mS it takes just to receive a MIDI note on event. What I still need to determine is how fast I can get the envelope generators to ramp up/down (more to come on that).

MIDI timings

bps

1S+8N1+1mark

Freq

Period

MIDI byte

Note event (x3 bytes)

MIDI byte

31250

11

2840.91

0.000352

352uS

1,056uS (1mS)

       

80C85 Buss timings

Frequency

Period

Time

   

ALE (machine) cycle

250000

0.00000400

4uS

   

CPU clock (ALE x3)

750000

0.00000133

1.33uS

   
       

Main loop 80C85 instructions

  

EG D2A S&H

5

0.000020

20uS

io write

  

Input Scanner

2

0.000008

8uS

mem read

  

Total 80C85 instructions

7

0.000028

28uS

   

March 10th 2024 - Envelope Generator Note Onset Performance

The envelope generators in the Poly-800 are produced by directing a digital to analog signal through a multiplexer to 8 separate sample and hold circuits. The image below is from the Poly-800 schematic and it shows those particular circuits. The red circle on the right shows the capacitor (C38) that acts as the 'hold' part of the sample and hold function (it's one of eight. One for each DCO EG). Those are 0.047uF mylar parts. The left hand circle shows R126 which is 47 ohms. That resistance, and the internal 'on' resistance within the multiplexer (IC12, a CMOS 4051) form an RC charge circuit. I believe that the 'on' resistance is 250 ohms (@5Vcc). That charge circuit is one of the factors that determines how fast (or slow) envelopes can be generated. Larger resistance or capacitance would slow down the maximum possible rate of change. Smaller values would likewise increase the maximum possible rate of change. Another factor, is the speed with which envelope levels can be setup on the D2A circuit and passed through the multiplexer. Finally, the speed of the two opamps (within IC38 TL062) would also potentially affect the maximum possible rate of change. So I am reviewing the schematic to try to determine what the theoretical maximum rate of change for the circuits are. And, I am reviewing the software performance to see how fast we can get the CPU to update the D2A. At the same time, I have ordered replacement capacitors that are half (0.022uf) and a quarter (0.013uf) of the originals. It may be a simple as replacing them like that.
D2A and SAH schematic

March 7th 2024 - Envelope Generator Timing

Work on the envelope generators has been progressing well. At this time, I've expanded the timings that are available for use with attack, decay, slope and release. The table below shows the available timers ranging from 5 milliseconds to one minute. I would appreciate feedback from you all on whether these values are useful or how you would prefer to see them set up. The parameter values are set within the range 1-50. At the minimum value (1), the Poly-800 envelope sample and hold (SAH) circuits are pushed to the limits of their design performance (more on that soon). Obtaining a very fast note onset is extraordinarily important. So I will be trying very hard to improve on 5mS. The good news is that, from 3 (15mS) and upward, the timing accuracy of the EG's is very good. I am not sure if anyone needs an EG that extends for 60 seconds but a huge advantage of using a 32 bit CPU is the ease with which it is possible to add functionality like long timers.
1 5mS 11 70mS 21 0.8 Seconds 31 4 Seconds 41 14 Seconds
2 10mS 12 80mS 22 0.9 Seconds 32 5 Seconds 42 15 Seconds
3 15mS 13 90mS 23 1 Second 33 6 Seconds 43 20 Seconds
4 20mS 14 0.1 Seconds 24 1.25 Seconds 34 7 Seconds 44 25 Seconds
5 25mS 15 0.2 Seconds 25 1.5 Seconds 35 8 Seconds 45 30 Seconds
6 30mS 16 0.3 Seconds 26 1.75 Seconds 36 9 Seconds 46 35 Seconds
7 35mS 17 0.4 Seconds 27 2 Seconds 37 10 Seconds 47 40 Seconds
8 40mS 18 0.5 Seconds 28 2.5 Seconds 38 11 Seconds 48 45 Seconds
9 50mS 19 0.6 Seconds 29 3 Seconds 39 12 Seconds 49 50 Seconds
10 60mS 20 0.7 Seconds 30 3.5 Seconds 40 13 Seconds 50 1 Minute

February 28th 2024

A quick update on new navigating and patch editing features:

February 24th 2024

I've made some progress with the user input (keypad and buttons) handlers and have some of the patch and parameter selection and editing working. Before I proceed further into that part of the code, I worked up a table that shows the proposed patch parameters and global parameters for the HAWK-832. The table is shown below. Many of the parameters are taken from the HAWK-800, which in turn are taken from the original Poly-800. There are so many new parameters in the HAWK-832 that they will have to be handled in P1, P2, P3 and GL/P4 user input modes. Please feel free to review the parameters and provide feedback. Keep in mind that whether a parameter (and thus, feature) makes it into the finished product depends on it being viable to implement. So for example, I plan on implementing six LFO's (4 LFO and 2 SLFO) and four envelope generators (which in practice actually means 10. 8 for each voice and two to act as operators. If it can be managed, I would even like to add another fifth envelope generator. We shall see. It will be necessary to perform testing during the implementaiton to see if all of those operators can be implemented while also maintaining a high performance profile. One of the drawbacks of the original Poly-800 and HAWK-800 are the sluggish attack/decay waveforms and the variable timings at note onset. First and foremost, it will be crucial that we get excellent EG waveforms. Additional LFO's and EG's are of secondary importance. You can hover over the red squares to see details of each parameter (I will complete them over the coming weeks).

P1 DCO1
DCO2
Tremolo and Detune
Effects
EG1
EG2
EG3
EG4
11 1-3 DCO octave Octave 21 1-3 DCO octave Octave 31 01-13 DCO1 modulation source selector DCO1 Modulation Source 41 Efx delay time 51 00-31 Attack Attack 61 00-31 Attack Attack 71 00-31 Attack Attack 81 00-31 Attack Attack
12 1-2 Square, Triangle Waveform 22 1-2 Square, Triangle Waveform 32 00-15 Modulation influence depth DCO1 Modulation Depth 42 Efx feedback 52 00-31 Decay Decay 62 00-31 Decay Decay 72 00-31 Decay Decay 82 00-31 Decay Decay
13 0-15 Harmonics selector mask Harmonics 23 0-15 Harmonics selector mask Harmonics 33 01-13 DCO2 modulation source selector DCO2 Modulation Source 43 Efx mod freq 53 00-31 Break point Break point 63 00-31 Break point Break point 73 00-31 Break point Break point 83 00-31 Break point Break point
14 1-13 Harmonics modulation selector/LFO Harmonics Modulation Waveform 24 1-13 Harmonics modulation selector/LFO Harmonics Modulation Waveform 34 00-15 Modulation influence depth DCO2 Modulation Depth 44 Efx mod intensity 54 00-31 Slope Slope 64 00-31 Slope Slope 74 00-31 Slope Slope 84 00-31 Slope Slope
15 1-6 Modulation LFO selector Harmonics Modulation LFO 25 1-6 Modulation LFO selector Harmonics Modulation LFO 35 00-11 DCO2 offset from DCO1 sounding notes DCO2 Interval 45 Efx level 55 00-31 Sustain Sustain 65 00-31 Sustain Sustain 75 00-31 Sustain Sustain 85 00-31 Sustain Sustain
16 0-15 Modulation influence depth Harmonics Modulation Depth 26 0-15 Modulation influence depth Harmonics Modulation Depth 36 00-03 DCO2 detune from DCO1 DCO2 Detune 46 MK2 EQ Bass 56 00-31 Release Release 66 00-31 Release Release 76 00-31 Release Release 86 00-31 Release Release
17 0-31 DCO Volume Level 27 0-31 DCO Volume Level 37 - 47 MK2 EQ Treble 57 00-15 Speed Speed 67 00-15 Speed Speed 77 00-15 Speed Speed 87 00-15 Speed Speed
18 1-2 DCO mode, single, double DCO Mode 28 1-5 Key Assign Modes, Poly, Chord, Hold, Portamento Mono, Portamento Unison Key Assign Mode 38 0-1 Extend the playing keyboard range and disable octave settings DCO Extended Range 48 Chorus Mode 58 0-2 ADBSSR, ADSR, ADBR (???) EG Mode 68 0-2 ADBSSR, ADSR, ADBR (???) EG Mode 78 0-2 ADBSSR, ADSR, ADBR (???) EG Mode 88 0-2 ADBSSR, ADSR, ADBR (???) EG Mode
P2 LFO1
LFO2
LFO1/2
LFO3
LFO4
SLFO 5/6
Velocity
ARP & Misc
11 01-16 LFO frequency Frequency 21 01-16 LFO frequency Frequency 31 1-4 Starting phase 0,90,180,270 LFO1 Start Phase 41 01-16 LFO frequency Frequency 51 01-16 LFO frequency Frequency 61 01-16 LFO frequency SLFO5 Frequency 71 OP1 Intensity 81 ARP Length
12 00-15 Onset delay Delay 22 00-15 Onset delay Delay 32 1-2 Internal, MIDI LFO1 Clock Source 42 00-15 Onset delay Delay 52 00-15 Onset delay Delay 62 00-63 PWM phase SLFO5 PWM Phase 72 OP1 Invert 82 ARP Direction
13 0-1 Free running Free Running 23 0-1 Free running Free Running 33 1-64 MIDI clocks LFO1 Clock Divider 43 0-1 Free running Free Running 53 0-1 Free running Free Running 63 0-1 Free running SLFO5 Free Running 73 OP1 Target 83 ARP Range
14 0-1 Onset delay invert Delay Invert 24 0-1 Onset delay invert Delay Invert 34 1-4 EG3, EG4, LFO5, LFO6 LFO1 Reset Source 44 0-1 Onset delay invert Delay Invert 54 0-1 Onset delay invert Delay Invert 64 1-4 Starting phase 0,90,180,270 SLFO5 Start Phase 74 OP2 Intensity 84 ARP Sort
15 00-63 PWM phase PWM Phase 25 00-63 PWM phase PWM Phase 35 1-4 Starting phase 0,90,180,270 LFO2 Start Phase 45 00-63 PWM phase PWM Phase 55 00-63 PWM phase PWM Phase 65 01-16 LFO frequency SLFO6 Frequency 75 OP2 Invert 85 ARP As Played
16 1-13 Harmonics modulation selector/LFO Modulation Waveform 26 1-13 Harmonics modulation selector/LFO Modulation Waveform 36 1-2 Internal, MIDI LFO2 Clock Source 46 1-13 Harmonics modulation selector/LFO Modulation Waveform 56 1-13 Harmonics modulation selector/LFO Modulation Waveform 66 00-63 PWM phase SLFO6 PWM Phase 76 OP2 Target 86 -
17 00-15 Modulation depth Modulation Depth 27 00-15 Modulation depth Modulation Depth 37 1-64 MIDI clocks LFO2 Clock Divider 47 00-15 Modulation depth Modulation Depth 57 00-15 Modulation depth Modulation Depth 67 0-1 Free running SLFO6 Free Running 77 VCF Intensity 87 -
18 1-6 Modulation LFO selector Modulation LFO 28 1-6 Modulation LFO selector Modulation LFO 38 1-4 EG3, EG4, LFO5, LFO6 LFO2 Reset Source 48 1-6 Modulation LFO selector Modulation LFO 58 1-6 Modulation LFO selector Modulation LFO 68 1-4 Starting phase 0,90,180,270 SLFO6 Start Phase 78 VCF Shape 88 -
P3 Set Points
DCO Mod
VCF Mod
Resonance Mod
Noise Mod
<New TG>
<New TG>
Misc
11 00-99 VCF level set point VCF 21 00-13 1st modulator LFO waveform and source selector 1st Modulation Waveform 31 00-13 1st modulator LFO waveform and source selector 1st Modulation Waveform 41 00-13 1st modulator LFO waveform and source selector 1st Modulation Waveform 51 00-13 1st modulator LFO waveform and source selector 1st Modulation Waveform 61 <New TG> 71 <New TG> 81 Bend Depth
12 00-99 Resonance level set point Resonance 22 1-6 1st modulator LFO source selector 1st Modulation LFO 32 1-6 1st modulator LFO source selector 1st Modulation LFO 42 1-6 1st modulator LFO source selector 1st Modulation LFO 52 1-6 1st modulator LFO source selector 1st Modulation LFO 62 <New TG> 72 <New TG> 82 Portamento Rate
13 00-99 Noise level set point Noise 23 00-15 1st Modulator influence depth 1st Modulation Depth 33 00-15 1st Modulator influence depth 1st Modulation Depth 43 00-15 1st Modulator influence depth 1st Modulation Depth 53 00-15 1st Modulator influence depth 1st Modulation Depth 63 <New TG> 73 <New TG> 83 Pedal Mode
14 00-31 DCO3 volume level set point (future) <DCO3 New TG> 24 00-13 2nd modulator LFO waveform and source selector 2nd Modulation Waveform 34 00-13 2nd modulator LFO waveform and source selector 2nd Modulation Waveform 44 00-13 2nd modulator LFO waveform and source selector 2nd Modulation Waveform 54 00-13 2nd modulator LFO waveform and source selector 2nd Modulation Waveform 64 <New TG> 74 <New TG> 84 Pedal Sustain Offset
15 00-31 DCO4 volume level set point (future) <DCO4 New TG> 25 1-6 2nd modulator LFO source selector 2nd Modulation LFO 35 1-6 2nd modulator LFO source selector 2nd Modulation LFO 45 1-6 2nd modulator LFO source selector 2nd Modulation LFO 55 1-6 2nd modulator LFO source selector 2nd Modulation LFO 65 <New TG> 75 <New TG> 85 RSH1 ¼ rate
16 - 26 00-15 2ndt Modulator influence depth 2nd Modulation Depth 36 00-15 2ndt Modulator influence depth 2nd Modulation Depth 46 00-15 2ndt Modulator influence depth 2nd Modulation Depth 56 00-15 2ndt Modulator influence depth 2nd Modulation Depth 66 <New TG> 76 <New TG> 86 Seq Note Follow Mode
17 - 27 1-2 2nd modulator is additive or attenuates 1st Modulation Mode 37 1-2 2nd modulator is additive or attenuates 1st Modulation Mode 47 1-2 2nd modulator is additive or attenuates 1st Modulation Mode 57 1-2 2nd modulator is additive or attenuates 1st Modulation Mode 67 <New TG> 77 <New TG> 87 RSH2 (???)
18 - 28 - 38 0-2 Keyboard tracking off, half, full Keyboard Tracking 48 0-2 Keyboard tracking off, half, full Keyboard Tracking 58 0-2 Keyboard tracking off, half, full Keyboard Tracking 68 <New TG> 78 <New TG> 88 0-1 Patch write locked Patch Locked
GL General
Sequences P4 MIDI
MIDI
<Growth>
<Growth>
<Growth>
<Growth>
11 11-88 Power on selected patch Selected Patch 21 0-1 Lock sequence 1 (no editing) Protect Sequence 1 31 00-16 MIDI reception channel or off MIDI Receive Channel 41 00-16 Sequencer MIDI transmit channel or off Sequencer MIDI Transmit Channel 51 - 61 - 71 - 81 -
12 1-4 Selected patch bank Selected Bank 22 0-1 Lock sequence 2 (no editing) Protect Sequence 2 32 0-1 Soft thru on/off MIDI Soft Thru 42 0-1 Send sequencer MIDI time code Sequencer Time Code Send 52 - 62 - 72 - 82 -
13 00-63 MIDI NRPN MSB device identification number NRPN MSB Device Identification 23 0-1 Lock sequence 3 (no editing) Protect Sequence 3 33 0-1 Keyboard local control on/off Keyboard Local Control 43 00-63 Sequencer MIDI clock ticks per beat Sequencer ticks per quarter note 53 - 63 - 73 - 83 -
14 0-1 Use scaled or absolute values for MIDI CC data values Scaled/Absolute CC data 24 0-1 Lock sequence 4 (no editing) Protect Sequence 4 34 00-16 Keyboard MIDI transmit channel or off Keyboard MIDI Transmit Channel 44 00-63 Advanced sequencer mode enable and quarter notes per bar Advanced Seq Mode 54 - 64 - 74 - 84 -
15 0-1 MIDI Omni Off/On Omni On/Off 25 0-1 Lock sequence 5 (no editing) Protect Sequence 5 35 Kbd MIDI Transmit Octave Offset 45 0-1 Sequencer clock internal/external Sequencer Clock Internal/External 55 - 65 - 75 - 85 -
16 0-2 Device cascading modes Cascading Mode 26 0-1 Lock sequence 6 (no editing) Protect Sequence 6 36 00-63 MIDI note on transmit velocity (0-127) Kbd MIDI Transmit Velocity 46 0-1 Joystick local control enable Joystick Local Control 56 - 66 - 76 - 86 -
17 0-2 Cascading mode patch synchronization Cascading Unit Sync 27 0-1 Lock sequence 7 (no editing) Protect Sequence 7 37 1-7 selected sequence Selected Sequence 47 00-16 Joystick MIDI transmit channel Joystick MIDI Transmit Channel 57 - 67 - 77 - 87 -
18 0-2 Device types. Poly-800, EX-800 and MK2 Device Type 28 00-xx Expansion hardware mask (future) Expansion Hardware 38 0-1 Sequencer local control on/off Seq Local Control 48 0-1 Update patch on reception of MIDI CC bank change MIDI Bank Select Patch Change 58 - 68 - 78 - 88 -

February 2024

So before beginning the task of rewriting the entire Poly-800 software in C. I figured I had better break down the effort into stages so that I can monitor progress along the way. Here are the major project steps:

Major Project Milestones and Activities
As can be seen above, the number and types of activities is significant. And the sheer number of lines of code that need to be re/written makes this project less than trivial. But at this point in time, I am hoping that I can complete the entire project in no more than 500 hours. If that time estimate is correct, and at 10 hours per week, that will take the project into early 2025. If I am lucky, the 500 hours estimate is more than enough. In which case, I might even be able to have the kit ready for Christmas 2024. It would be great if I could have it ready in December 2024.

January 2024

All of the the HAWK-832 interfacing to the Poly800 hardware has been proven out in testing (excluding the sequencer/arpeggiator clock interrupt which has to wait until I get updated HAWK-832 modules to work with. The prototype modules I am working with now can't work with the sequencer interrupt due to a timer mapping problem that required rerouting the sequencer interrupt pin). And I now have working analog to digital operation and envelope generator signal generation. At this time, I'm assessing the work program to decide which components of the software will be developed next. Once the list of modules is developed, I'll post them here. I am also toying with the idea of posting the code onto github so that other contributors can help to speed up the software development process. If you would like to help, contact Mike at support@hawk800.com. Now that the hardware is almost 100% proven, I can proceed to the major part of the project, which is to forward engineer the assembler into C.

2023

Development activity restarted in mid 2023. Internal use of STM32 CPU hardware includes using TIM2 ISR for the EG's. EXT15 ISR sampling pins 15 and 14 for MIDI and Sequencer. TIM19 (no ISR) for ALE pin and for CPU machine cycle timing. TIM4 (no ISR) for 68B50 MIDI UART clock. This all works and is the point at which hardware testing is completed. However, the 68B50 and SOD pins need to be swapped and the board updated. Fortunately, coding can proceed on everything except the sequencer while new boards are ordered and populated. Coding of the synth is commencing. Before I do that though, I needed to consider the best method for proceeding to code. The three options then, are to:
1) mentally disassemble the assembler and convert into C
2) rewrite the entire code directly in C
3) create a JIT compiler (in C) that compiles 80C85 assembler
I have decided to rewrite the existing assembler into C. It turns out that I am able to 'forward' engineer assembler into C reasonably well. It helps alot that my documentation in the assembler is very detailed. So the method will be sort of a combination of option 1 and option 2. Some of the code will be migrated from assembler to C and some of it will be a complete rewrite. How much of each really depends on the part of the code. For example, the flash memory subroutines will have to be completely rewritten from scratch because the hardware is completely different. Also, all of the interrupt service routine code will have to be done from scratch. But alot of the rest of the code can be migrated.

2021/2022

No development activity occurred in 2021 or 2022.

2020

Prototypes were created and initial efforts to begin software development and prototype testing were underway. A problem was found with the address bus latch signals which stopped the prototype from working on the 80C85 bus. The design was corrected and new boards ordered, populated and tested.

2019

The HAWK-832 prototype was first developed on 'paper' in late 2019. No prototypes were created until April 2020.

Home - Contact - Credits - Copyright © Wantegrity All Rights Reserved 2007-2024 - Valid HTML 4.01 Transitional [5395]