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.

June 30th 2024 - MIDI Data Reception Stops while Saving Patches and Globals to Flash Memory

While I was working on the Chord and Hold poly assign modes, I discovered a problem when saving patches or globals to flash memory. MIDI data reception would stop during the flash write and would not resume either! Not good. It turns out that by default, all interrupts are ignored while the STM32 writes to flash memory. This is because read access to flash memory is blocked while flash writing is underway. And since the interrupt vector table is stored in flash, interrupts servicing is stalled until the flash write completes. The solution requires several steps, which I go through in a separate article here.

June 17th 2024 - DCO Harmonics Progression, Tremolo (VCA modulation), EG Re-Triggering, LFO Delay Timers and Behavior, LFO FM and LFO PWM Modulation, and LFO Starting Phase

It has been a busy month. I have implemented a much improved harmonics modulation feature for the two DCO banks. There are 42 different harmonics progressions available which allows for some very nice melodic combinations (see the table of progressions here). Tremolo has also been implemented and it is expanded beyond the HAWK-800. Now you can choose from 16 different waveforms/sources and any of the six LFO's. I have also written and tested re-triggering of the envelope generators by the LFO's. Yet to be done will be re-triggering EGs by MIDI clock and sequencer looping. LFO delay timers have been implemented with delays of 0 to 9.9 seconds available. Also, the delay expiration has a new parameter available that allows for reseting the LFO value to initial state so that modulations are not left in an ambiguous state (a more comprehensive description to come about that later). And, I have also completed work on the modulation of LFO frequency. In addition, I was able to implement modulation of the PWM phase. Since I don't foresee needing LFO FM and LFO PWM modulation that often, I have split those features across the odd and even LFO's. So the LFO FM is available on LFO1 and LFO3 while the PWM modulation is available on LFO2 and LFO4. Finally, LFO starting phase position (0, 90, 180, 270 degrees) has been implemented for all six LFOs.

May 5th 2024 - LFOs, Envelope Generators and Modulators

The major LFO waveforms (triangle, saw, sine, square PWM) are all tested and working. There was a nasty "glitchy" noise happening on note onset. That turned out to be a bug in my reseting logic of the EG3 and EG4 envelope generators. I was incorrectly reseting EG8/9 instead of EG9/10. Tooks hours to figure that one out. I've changed the modulation interrupt service routine so that most of the code is executed in the main line. The ISR simply sets a flag. The main line code then runs the modulation functions when it detects the flag is set. Due to the high speed CPU, the modulation functions are executed very soon after the flag is set. And I have a monitoring variable in place that watches for ISR flag overruns. So far, no sign of any overruns. Placing the modulation functions in main line also gives the advantage of being able to preset them at note onset which can theoretically speed up envelope generator onset speeds (even more). Modulations are working and tested for VCF, resonance, and white noise. This includes dual modulations using LFOs or EGs, both additive and attenuative combinations. More steady progress.

April 25th 2024 - LFOs, Envelope Generators and Modulators

I made progress with the LFO's. They're now operating. Further tweaking of the envelope generators was also done and tested. The noise gate operation was implemented and tested. And the 1st modulator of the VCF has been implemented too. Steady progress.

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/Modulators D2A S&H

6

0.000024

24uS

io write

  

Input Scanner

2

0.000008

8uS

mem read

  

Total 80C85 instructions

8

0.000032

32uS

   

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-60. 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. So providing the long duration envelope timing was easy. The table below shows the range of durations for the attack, decay, slope, and release parameters.

1

5mS

11

70mS

21

0.45 Seconds

31

2 Seconds

41

9 Seconds

51

19 Seconds

2

10mS

12

80mS

22

0.5 Seconds

32

2.5 Seconds

42

10 Seconds

52

20 Seconds

3

15mS

13

90mS

23

0.6 Seconds

33

3 Seconds

43

11 Seconds

53

22 Seconds

4

20mS

14

0.1 Seconds

24

0.7 Seconds

34

3.5 Seconds

44

12 Seconds

54

24 Seconds

5

25mS

15

0.15 Seconds

25

0.8 Seconds

35

4 Seconds

45

13 Seconds

55

26 Seconds

6

30mS

16

0.2 Seconds

26

0.9 Seconds

36

4.5 Seconds

46

14 Seconds

56

28 Seconds

7

35mS

17

0.25 Seconds

27

1 Second

37

5 Seconds

47

15 Seconds

57

30 Seconds

8

40mS

18

0.3 Seconds

28

1.25 Seconds

38

6 Seconds

48

16 Seconds

58

40 Seconds

9

50mS

19

0.35 Seconds

29

1.5 Seconds

39

7 Seconds

49

17 Seconds

59

50 Seconds

10

60mS

20

0.4 Seconds

30

1.75 Seconds

40

8 Seconds

50

18 Seconds

60

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 implementation 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 and fast, responsive note onset. Additional LFO's and EG's are of secondary importance. UPDATE June 19th 2024 - the table below shows the current parameter list.

P1

DCO1

 

DCO2

 

DCO VCA and Detune

 

EFX

 

EG1 (DCO1)

 

EG2 (DCO2)

 

EG3

 

EG4

 

11

Octave

21

Octave

31

DCO1 Mod Source

41

EFX delay time

51

Attack

61

Attack

71

Attack

81

Attack

 

12

Waveform

22

Waveform

32

DCO1 Mod LFO

42

EFX feedback

52

Decay

62

Decay

72

Decay

82

Decay

 

13

Harmonics

23

Harmonics

33

DCO1 Mod Depth

43

EFX mod freq

53

Break point

63

Break point

73

Break point

83

Break point

 

14

Harmonics Modulation Sequence

24

Harmonics Modulation Sequence

34

DCO2 Mod Source

44

EFX mod intensity

54

Slope

64

Slope

74

Slope

84

Slope

 

15

Harmonics Modulation LFO

25

Harmonics Modulation LFO

35

DCO2 Mod LFO

45

EFX level

55

Sustain

65

Sustain

75

Sustain

85

Sustain

 

16

-

26

-

36

DCO2 Mod Depth

46

MK2 EQ Bass

56

Release

66

Release

76

Release

86

Release

 

17

Level

27

Level

37

DCO2 Interval

47

MK2 EQ Treble

57

-

67

-

77

Keyboard Trigger

87

Keyboard Trigger

 

18

DCO Mode

28

Key Assign Mode

38

DCO2 Detune

48

Chorus Mode

58

Other Trigger

68

Other Trigger

78

Other Trigger

88

Other Trigger

 

P2

LFO1

 

LFO2

 

LFO3

 

LFO4

 

SLFO 5/6

 

LFO

 

LFO

 

Velocity

 

11

Frequency

21

Frequency

31

Frequency

41

Frequency

51

SLFO5 Frequency

61

LFO1 Start Phase

71

LFO1 Freq Kybd Track

81

OP1 Intensity

 

12

Delay

22

Delay

32

Delay

42

Delay

52

SLFO5 PWM Phase

62

LFO2 Start Phase

72

LFO2 Freq Kybd Track

82

OP1 Invert

 

13

Delay Invert

23

Delay Invert

33

Delay Invert

43

Delay Invert

53

SLFO5 Reset

63

LFO3 Start Phase

73

 

83

OP1 Target

 

14

Reset

24

Reset

34

Reset

44

Reset

54

SLFO5 Start Phase

64

LFO4 Start Phase

74

 

84

OP2 Intensity

 

15

PWM Phase

25

PWM Phase

35

PWM Phase

45

PWM Phase

55

SLFO6 Frequency

65

LFO1 Clock Source

75

 

85

OP2 Invert

 

16

FM Waveform

26

PWM Mod Waveform

36

FM Waveform

46

PWM Mod Waveform

56

SLFO6 PWM Phase

66

LFO2 Clock Source

76

 

86

OP2 Target

 

17

FM LFO

27

PWM Mod LFO

37

FM LFO

47

PWM Mod LFO

57

SLFO6 Reset

67

LFO3 Clock Source

77

 

87

VCF Intensity

 

18

FM Depth

28

PWM Mod Depth

38

FM Depth

48

PWM Mod Depth

58

SLFO6 Start Phase

68

LFO4 Clock Source

78

 

88

VCF Shape

 

P3

Set Points

 

DCO Freq Mod

 

VCF Mod

 

Resonance Mod

 

Noise Mod

 

Sequencer

 

ARP & Misc

 

Misc

 

11

VCF

21

1st Modulation Waveform

31

1st Modulation Waveform

41

1st Modulation Waveform

51

1st Modulation Waveform

61

-

71

ARP Length

81

Bend Depth

 

12

Resonance

22

1st Modulation LFO

32

1st Modulation LFO

42

1st Modulation LFO

52

1st Modulation LFO

62

-

72

ARP Direction

82

Portamento Rate

 

13

Noise

23

1st Modulation Depth

33

1st Modulation Depth

43

1st Modulation Depth

53

1st Modulation Depth

63

-

73

ARP Range

83

Pedal Mode

 

14

<DCO3 New TG>

24

2nd Modulation Waveform

34

2nd Modulation Waveform

44

2nd Modulation Waveform

54

2nd Modulation Waveform

64

-

74

ARP Sort

84

Pedal Sustain Offset

 

15

<DCO4 New TG>

25

2nd Modulation LFO

35

2nd Modulation LFO

45

2nd Modulation LFO

55

2nd Modulation LFO

65

Selected Sequence

75

ARP As Played

85

-

 

16

-

26

2nd Modulation Depth

36

2nd Modulation Depth

46

2nd Modulation Depth

56

2nd Modulation Depth

66

Sequencer ¼ Note RSH

76

-

86

-

 

17

-

27

Modulation Mode

37

Modulation Mode

47

Modulation Mode

57

Modulation Mode

67

Sequencer Loop RSH

77

-

87

-

 

18

-

28

Modulation Send

38

Keyboard Tracking

48

Keyboard Tracking

58

Keyboard Tracking

68

Seq Note Follow Mode

78

-

88

Patch Locked

 

GL

General

 

Sequences

P4

MIDI

 

MIDI

 

MIDI Clocks

 

<Growth>

 

<Growth>

 

<Growth>

 

11

Selected Patch

21

Protect Sequence 1

31

MIDI Receive Channel

41

Seq MIDI Tx Channel

51

MIDI Clock 1

61

<New TG>

71

<New TG>

81

<New TG>

 

12

Selected Bank

22

Protect Sequence 2

32

MIDI Soft Thru

42

Seq Time Code Send

52

MIDI Clock 2

62

<New TG>

72

<New TG>

82

<New TG>

 

13

NRPN MSB Device Identification

23

Protect Sequence 3

33

Kbd Local Control

43

Seq Ticks per quarter note

53

MIDI Clock 3

63

<New TG>

73

<New TG>

83

<New TG>

 

14

Scaled/Absolute CC data

24

Protect Sequence 4

34

Kbd MIDI Tx Channel

44

Advanced Seq Mode

54

MIDI Clock 4

64

<New TG>

74

<New TG>

84

<New TG>

 

15

Omni On/Off

25

Protect Sequence 5

35

Kbd MIDI Tx Octave Offset

45

Seq Clock Int/Ext

55

Seq Clock 1

65

<New TG>

75

<New TG>

85

<New TG>

 

16

Cascading Mode

26

Protect Sequence 6

36

Kbd MIDI Tx Velocity

46

Joystick Local Control

56

Seq Clock 2

66

<New TG>

76

<New TG>

86

<New TG>

 

17

Cascading Unit Sync

27

Protect Sequence 7

37

Selected Sequence

47

Joystick MIDI Tx Channel

57

Seq Clock 3

67

<New TG>

77

<New TG>

87

<New TG>

 

18

Device Type

28

Expansion Hardware

38

Seq Local Control

48

MIDI Bank Select Patch Change

58

Seq Clock 4

68

<New TG>

78

<New TG>

88

<New TG>

 

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 [8877]