TL;DR KLST_SHEEP is really nice, it has a screen, reads WAV files from the SD Card and behaves like it’s supposed to.
it has been a while since the last update to the developer diary this however does not mean that i wasn’t busy. the main focus in the last weeks was set on updating the new KLST_SHEEP board and getting it’s features to work. still some other things happend, too.
the long detailed version follows below:
KLST_SHEEP and next steps
the new KLST_SHEEP has proven to be really solid; in a sense that up until now i could not find any hardware errors. all peripherals work as expected. e.g:
- USB peripherals :: work as device and host and both at the same time
- TFT display :: tested with different sizes and types
- SD card :: can load and save sample data
- audio jack :: works with 3-ring connector ( head phones + mic aka headset )
however i would not call the board perfect … just yet. i am still not happy with the green color of the PCB and the tiny RAM is bugging me as well. therefore a new board is planning: KLST_PANDA
apart from the hardware side there were also quite a lot of changes on the software side, too. a lot of bug fixed and some new features:
two libraries have been added: one for reading from ( and writing to WIP ) an SD card and one for drawing on a TFT display.
read about the display library at Klangstrom Display Library
SD Card Library
the SD card library is based on the SdFat library for Arduino. it is still very basic but one thing it can ( on top ) is parse ( some ) WAV files. this is, of course, very handy for loading sample data into RAM.
Under the Hood
there were also some a bit more under the hood changes.
syntax coloring for klangstrom-related keywords was added. this has turned the examples into very colorful texts now … i like it.
the documentation has been extended by a page for KLST_SHEEP and Klang source code to documentation has been added-
there is now an option to select sampling rate and audio block size in the Arduino IDE ( although the default values are quite reasonable as they are ).
the underlying STM32duino project was updated to the most current verion: v2.2.0
there is now a method to retreive a single lengthy string with a unique identifier (
U_ID ) that is different for every single MCU. the
U_ID can be retreived via
klangstrom::U_ID() and is represented as a
string. it can be very helpful e.g for writing applications that are supposed to behave slightly but not entirely differently on multiple boards.
an equally minor but handy change was made to the LEDs. they can now be toggled, turned on and off from a single method:
LED(ID,STATE) ( e.g
LED(LED_03, LED_TOGGLE); ).
and finally the examples were cleaned up ( WIP ) and rearranged quite a bit.
apart from adding KLST_SHEEP to the platform, most work ( or at least time … and nerves ) went into USB Device + Host implementation. i must say it is still not 100% but most things work now.
USB Device support for Mouse + Keyboard + MIDI is now implented via the HAL library ( that is the one maintained by ST themselves ). i.e boards can act as USB devices such as computer mouses, keyboards or MIDI devices. i was already considering to maybe add support for USB audio devices so that the boards can act as sound cards with digital audio in- and outputs.
USB Host support for Mouse + Keyboard + MIDI is now implemented also via HAL library. i.e boards can now host USB devices like computer mouses, keyboards and MIDI devices. there is still no support for USB Hubs. which in itself is not such a big issue because i do not expect to connect loads of devices to the boards. however, a lot of computer keyboards act as USB Hubs ( e.g when the have extra USB connectors on the side ). such keyboards are not recognized by this library.
support for USB Devices via TinyUSB has been deprecated and will probably be removed in a next release. for more details read TinyUSB First I Was Like Yeah! Then I Was Like Naaaargh!
as mentioned above KLST_SHEEP now has native support for display and SD card which is quite a big leap in terms of applications ( #weekendprojects ).
and one really nerdy but interesting change i made to the way the memory is managed. i learned a lot about the different types of memory and how to specifically use them ( via sections defined in the linker script ( e.g
.dma_buffer ) and attributes used in application code ( e.g
__attribute__((section(".dma_buffer"))) ) ). this allowed to optimize the usage of the RAM in a way that bigger chunks of memory can now be allocated ( e.g for sample data ).
the desktop version or simulator is now called emulator. read about all changes here: Simulator is now called Emulator and got Face Lift
although Klang is already pretty complete i still found some space to makes some changes.
the memory allocation for audio blocks was moved to static memory so that it interacts better with MCUs.
i started updating those nodes that store data in a way that they can accept different data types: 8/16-bit un/signed integers and 32-bit floats ( i.e
NodeSampler now support these 5 different data types.
NodeKernelBlockMulti was added to the library. it supports ( theoretically ) up to 256 input and output channels. on a more general note: all
NodeKernel* classes assist in the easy development of custom nodes. i don’t think that i will refactor all other nodes to be based on these classes but for quick testing or not-performance relevant nodes they are quite handy.
maximum delay ( line ) length for
NodeDelay can now be globally configured (
#define NODE_DELAY_BUFFER_SIZE BUFFER_SIZE_IN_SAMPLES ).
NodeFFT was added to perform Fast Fourier Transfom on audio signals. however, it seems to behave weirdly on MCUs. this needs some more testing.
ok, Strom is somehow the stepchild of this whole project. i hope to soon rectify this. but at least Strom was now added to the repository and a few basic tools and utilities were implemented ( e.g events via
bit_bang() ). but it is still very much a work-in-progress ( WIP ).
however one new member to the family was introduced: the
TaskScheduler. it was added to easily created time-based callbacks. each task can be connected to a single function callback. the scheduler needs to be updated from within
loop(). it’s not at all advanced but allows for some easy repetitive event scheduling.
git Commit Messages
or to put the last weeks in
2022-02-21 : updated dev diary 2022-02-21 : added script to automatically test all examples 2022-02-21 : updated README 2022-02-18 : added test script for examples 2022-02-17 : reorganized examples, move usb option `none` to default 2022-02-17 : rearranged examples 2022-02-16 : added USB Device support for KLST_CORE 2022-02-16 : minor changes 2022-02-15 : revived KLST_CORE, fixed USB Host + Device options 2022-02-15 : added self powered flag 2022-02-14 : minor fixes 2022-02-14 : minor changes 2022-02-14 : minor changes 2022-02-14 : added USB Device MIDI ( not working yet ) 2022-02-14 : USB Device now supports keyboard and mouse HID 2022-02-14 : renamed library to USBDeviceTinyUSB 2022-02-14 : minor changes 2022-02-14 : implemented USB Device HID with HAL library 2022-02-14 : added HAL based USB Device Library 2022-02-14 : minor changes 2022-02-14 : minor changes 2022-02-14 : moved USB clock init to `board_init`, cleaned up variants 2022-02-11 : update STM32duino files to 2.2.0 2022-02-11 : minor changes 2022-02-11 : back to C++17 again, minor changes 2022-02-11 : minor changes 2022-02-11 : minor changes 2022-02-11 : revived USB Host on KLST_SHEEP + KLST_CORE, reverted to C++11 2022-02-11 : USB Host ID (FS||HS) is now handle bsp 2022-02-11 : cleaned up host and got it to working again on 2022-02-10 : completely broke USB Device + Host for all boards 2022-02-10 : minor changes 2022-02-10 : minor changes 2022-02-10 : updated TinyUSB current version (0.12.0+) 2022-02-10 : tried optimizing variant definition to make USB DEvice work ( no success ) 2022-02-09 : tried to fix USB Device … with no success … totally erratic 2022-02-09 : worked on USB Device 2022-02-07 : tried implementing USB Host + Device for KLST_SHEEP ( not working ) 2022-02-07 : changed SAI clock speed, changed USB clock, minor changes 2022-02-04 : made wavetable now supports different dataypes 2022-02-03 : made VCO wavetable size fixed 2022-02-03 : updated copyright notice 2022-02-02 : added sampler view 2022-02-02 : updated keywords 2022-02-02 : updated copyright notice 2022-02-02 : updated keywords 2022-02-02 : updated copyright notice 2022-02-02 : updated copyright notice 2022-02-02 : minor updates 2022-02-01 : added stm32 includes 2022-01-31 : added `NodeBlockMulti` with up to 256 input and output channels 2022-01-31 : added amplification channel to NodeVCA ( + example with LFO ) 2022-01-31 : added amplification channel to NodeVCA ( + example with LFO ) 2022-01-31 : added in/out to NodeSampler, improved examples, 2022-01-30 : added applications 2022-01-30 : added option to pass folder path to `Card.begin` mainly for dev 2022-01-29 : improved serial data receive events 2022-01-28 : cleaned up examples 2022-01-28 : added display example 2022-01-28 : added display example 2022-01-28 : updated card examples 2022-01-28 : updated card examples 2022-01-28 : finished 4x4 drum machine 2022-01-26 : aborted DMA+display experiment for now 2022-01-26 : moved SPI do different clock 2022-01-26 : minor changes 2022-01-26 : added DMA on SPI3, transferred settings from CubeIDE 2022-01-26 : updated alternative drivers 2022-01-26 : preparing to add DMA driver for KLST_SHEEP display implementation 2022-01-24 : finished weekend project 4×4 drum machine 2022-01-24 : finished weekend project 4×4 drum machine 2022-01-24 : added master volume to multi stereo node 2022-01-24 : removed proportional volume adjustment in mixers 2022-01-24 : fixed audio block pool memory issue, increased C/C++ standard to C/C++17 2022-01-24 : minor changes 2022-01-22 : made a sample-based drum machine 2022-01-22 : minor changes 2022-01-22 : added task scheduler, minor changes 2022-01-20 : update WAV importer to I16 2022-01-20 : switched WAV importer to I16 2022-01-20 : started implementing different formats 2022-01-20 : improved node sample ( can play backwards now too ) 2022-01-20 : cleaned up examples 2022-01-20 : added option to just read the header of a WAV file 2022-01-20 : improved type handling in sampler 2022-01-20 : added attribute `.sample_buffer` to RAM_D2 domain ( 288K on STM32H743VIT ) 2022-01-20 : moved audio pool buffers to dedicated memory region ( on MCUs ) 2022-01-19 : worked on memory management and linker script 2022-01-18 : updated includes, reduced buffer size for file reading ( needs testing ) 2022-01-18 : added strom patterns 2022-01-18 : updated build system for card library 2022-01-18 : updated examples and sources 2022-01-18 : minor changes 2022-01-18 : fixed memory leak in audio player 2022-01-18 : added card library 2022-01-18 : added audio player example 2022-01-18 : fixed encoder ID 2022-01-18 : added `boards.txt` to suppress warnings 2022-01-18 : imporved encoder behavior in SDL + KLST 2022-01-18 : added `delta` to encoder rotated event 2022-01-17 : improved SDL view, implemented SDL encoder, cleaned up defines + events 2022-01-17 : refined event handling, renamed "encoder rotate" to "encoder rotated" 2022-01-17 : added encoders to SDL 2022-01-17 : minor changes 2022-01-16 : fixed card on MCU + CPU platforms ( card is now a library ) 2022-01-16 : implemented Card KLST version ( mostly works ) 2022-01-16 : added SdFat library, moved KlangstromCard to library folder ( not done yet ) 2022-01-16 : extracted methods in Card, started KLST card implementation 2022-01-15 : made WAV reader multi-channel 2022-01-15 : added WAV file importer to SDL 2022-01-15 : added card, fixed KLST_SHEEP encoder 2022-01-14 : renamed tools 2022-01-14 : enabled software filtering for encoder 2022-01-13 : fixed encoders 2022-01-13 : finished draw audio buffer 2022-01-13 : cleaned up, started draw audio buffer 2022-01-12 : optimized display 2022-01-12 : implemented KLST display, cleaned up font 2022-01-12 : switched endianess in image converter 2022-01-11 : separated general and specific implementations 2022-01-11 : added display fonts 2022-01-11 : minor changes 2022-01-11 : cleaned up fonts 2022-01-11 : updated font, added 5x8 font, improved editor 2022-01-10 : updated font 2022-01-10 : added Font_7x9 2022-01-10 : added 565 image converter and 565 font editor 2022-01-09 : cleaning up fonts 2022-01-09 : introducing fonts 2022-01-08 : added font+image support, added address window emulation 2022-01-08 : updated display 2022-01-07 : renamed SD Card pin labels 2022-01-05 : reworked LEDs, started native SPI LCD support for KLST_SHEEP 2022-01-03 : started display 2022-01-03 : minor changes 2022-01-03 : added simluation platform 2022-01-03 : introduced build script for SDL 2021-12-21 : minor changes, trying to track 5min-switch-off-bug in SDL 2021-12-11 : fixed audio output 2021-12-08 : updated SAI configuration 2021-12-08 : cleaned up 2021-12-07 : cleaned up 2021-12-07 : updated STM32duino to 2.1.0 ( added build options ) 2021-12-07 : updated STM32duino to 2.1.0 ( system ) 2021-12-07 : updated STM32duino to 2.1.0 ( core ) 2021-12-07 : updated STM32duino to 2.1.0 ( added build options ) 2021-12-07 : updated STM32duino to 2.1.0 ( libraries ) 2021-12-07 : updated STM32duino to 2.1.0 2021-12-04 : added LED 2021-12-04 : used original ld script … works 2021-12-03 : removed UART + PWM Msp functions 2021-12-03 : removed KLST_SHEEP compile time errors 2021-12-03 : added KLST_SHEEP 2021-12-03 : optimized modulo 2021-11-28 : added articles