9bacf43f155998c5d4baae7eb0248196b496b697
Each channel can enable CV 1 or CV 2 as an input source for modulation, which can be applied to any of the user-editable parameters. When editing the parameter, cv mod is not applied in the UI so the user can easily see the base value for editing. When not editing, the UI will display the current cv modded value in the UI for the modded parameter. I had originally intended to provide configuration for attenuating and offsetting the cv input per channel, but that introduced a significant amount of memory needed to store several new ints per channel. I may return to add this feature later, but given it's something that can easily be done with other modules between the modulation source and Gravity cv input, I am deprioritizing this feature. Reviewed-on: https://git.pinkduck.xyz/adam/libGravity/pulls/4 Co-authored-by: Adam Wonak <adam.wonak@gmail.com> Co-committed-by: Adam Wonak <adam.wonak@gmail.com>
Sitka Instruments Gravity Firmware Abstraction
This library helps make writing firmware easier by abstracting away the initialization and peripheral interactions. Now your firmware code can just focus on the logic and behavior of the app, and keep the low level code neatly tucked away in this library.
Installation
Download or git clone this repository into your Arduino > libraries folder.
Common directory locations:
- [Windows]
C:\Users\{username}\Documents\Arduino\libraries - [Mac]
/Users/{username}/Documents/Arduino/libraries - [Linux]
~/Arduino/libraries
Required Third-party Libraries
- uClock [MIT] - Handle clock tempo, external clock input, and internal clock timer handler.
- RotateEncoder [BSD] - Library for reading and interpreting encoder rotation.
- Adafruit_GFX [BSD] - Graphics helper library.
- Adafruit_SSD1306 [BSD] - Library for interacting with the SSD1306 OLED display.
Example
Here's a trivial example showing some of the ways to interact with the library. This script rotates the active clock channel according to the set tempo. The encoder can change the temo or rotation direction. The play/pause button will toggle the clock activity on or off. The shift button will freeze the clock from advancing the channel rotation.
#include "gravity.h"
byte idx = 0;
bool reversed = false;
bool freeze = false;
byte selected_param = 0;
// Initialize the gravity library and attach your handlers in the setup method.
void setup() {
// Initialize Gravity.
gravity.Init();
// Attach handlers.
gravity.clock.AttachIntHandler(IntClock);
gravity.encoder.AttachRotateHandler(HandleRotate);
gravity.encoder.AttachPressHandler(ChangeSelectedParam);
gravity.play_button.AttachPressHandler(HandlePlayPressed);
// Initial state.
gravity.outputs[idx].High();
}
// The loop method must always call `gravity.Process()` to read any peripherial state changes.
void loop() {
gravity.Process();
freeze = gravity.shift_button.On();
UpdateDisplay();
}
// The rest of the code is your apps logic!
void IntClock(uint32_t tick) {
if (tick % 12 == 0 && ! freeze) {
gravity.outputs[idx].Low();
if (reversed) {
idx = (idx == 0) ? OUTPUT_COUNT - 1 : idx - 1;
} else {
idx = (idx + 1) % OUTPUT_COUNT;
}
gravity.outputs[idx].High();
}
}
void HandlePlayPressed() {
gravity.clock.Pause();
if (gravity.clock.IsPaused()) {
for (int i = 0; i < OUTPUT_COUNT; i++) {
gravity.outputs[i].Low();
}
}
}
void HandleRotate(Direction dir, int val) {
if (selected_param == 0) {
gravity.clock.SetTempo(gravity.clock.Tempo() + val);
} else if (selected_param == 1) {
reversed = (dir == DIRECTION_DECREMENT);
}
}
void ChangeSelectedParam() {
selected_param = (selected_param + 1) % 2;
}
void UpdateDisplay() {
gravity.display.clearDisplay();
if (freeze) {
gravity.display.setCursor(42, 30);
gravity.display.print("FREEZE!");
gravity.display.display();
return;
}
gravity.display.setCursor(10, 0);
gravity.display.print("Tempo: ");
gravity.display.print(gravity.clock.Tempo());
gravity.display.setCursor(10, 10);
gravity.display.print("Direction: ");
gravity.display.print((reversed) ? "Backward" : "Forward");
gravity.display.drawChar(0, selected_param * 10, 0x10, 1, 0, 1);
gravity.display.display();
}
Description
Hardware Abstraction Library for the Sitka Instruments Gravity module.
https://sitkainstruments.com/gravity/
Languages
C++
93.9%
C
6.1%