From 1fa9b08f15f14b090ca790e9015ae4a0f1bd0c97 Mon Sep 17 00:00:00 2001 From: James Fenn Date: Tue, 6 Apr 2021 16:49:10 -0400 Subject: [PATCH] fix typo --- blog/2021-01-31-Audio-Automation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/2021-01-31-Audio-Automation.md b/blog/2021-01-31-Audio-Automation.md index 2948ced..fe67c0d 100644 --- a/blog/2021-01-31-Audio-Automation.md +++ b/blog/2021-01-31-Audio-Automation.md @@ -46,7 +46,7 @@ With this established, implementing the MIDI API was as simple as connecting the ## Solving Latency Issues -When I ran my first program with this library, it seemed a bit unstable - the timing was inconsistent, and some notes played faster than others - which wasn't a great experience after spending an entire day building it. While my metronome was working correctly, it seems that Flows (or Java in general) are not as precise with their timing. Some flows were taking 100ms or more to process an event, which had drastic consequences the music my program was playing. +When I ran my first program with this library, it seemed a bit unstable - the timing was inconsistent, and some notes played faster than others - which wasn't a great experience after spending an entire day building it. While my metronome was working correctly, it seems that Flows (or Java in general) are not as precise with their timing. Some flows were taking 100ms or more to process an event, which had drastic consequences for the music my program was playing. I decided that the easiest way to solve this would be to attach a specific timestamp to each event - a `metronome(500)` would send `startTime + [0, 500, 1000, 1500, ...]` and so on. However, this presented the challenge of how to send multiple values through the path of a single Flow. Since flows only support one data type, I needed to either create a wrapper object for every value they use, or write my own implementation; I ended up doing a bit of both. -- GitLab