swampflux / tri-plus-ger Goto Github PK
View Code? Open in Web Editor NEWAlternative firmware for Qu-Bit Tri-ger
License: GNU General Public License v3.0
Alternative firmware for Qu-Bit Tri-ger
License: GNU General Public License v3.0
The idea here is that the user effectively presses on-off-on. only counting three beats initially feels awkward but it's more intuitive the longer I think about it. In live TV, a verbal countdown stops before reaching zero. skipping a beat will let the user have a moment to move their hands in to place and perhaps even record a bit into the pre-roll. That could be really innovative and genuinely awesome.
Created from #5
I think that the clock class's reset function will handle this, but actually outputting the clock signal should come from main loop. it hasn't been wired up yet
Retrigger, play/pause, and roll have just one analog pin each yet the original firmware seems to know the difference between a button press and CV input. Figure out what's going on. Write a new function or class if necessary.
Created from #5 This might be resolved with #9 or even with #11.
The idea was that the clock input might be coming from one module and that the user might want the behavior of the retrigger to be one of two modes
but if the incoming clock is not perfectly in sync, then the clock cannot reliably tell us when to trigger high. The retrigger offset would need to be added to that timestamp.
The beat weight feature should be an enhancement not something you have to think about if you're just coming from the stock firmware. I think it would be intuitive to..
This way all beats to be recorded and played back as if the feature wasn't there at all.
Tri-ger seems to be using a shift register to read from knobs and potentially other things on the board like slave/master pins. This issue will track all the nonsense that's going on with that effort.
Created from #5. Maintain the clock rate regardless of the sync. Keep track of how many beats need to have pulsed. Something.
Synchronize to Clock Input and allow clock multiply/divide via clock division knob
I've been a little too forceful in optimizing my inputs to the point that things stopped working. Arduino inputs are 10-bit. B1111111111
is the same as 1023
That's cool but it's time to diex everywhere I used a uint8_t
variable and lost the 2 most significant bits.
Created from #5
Not everyone has a Pam's. I think the most obvious solution would be to detect if there are changes happening on the Tempo input.
If beats in memory have not changed for 4 bars, write to EEPROM automatically
Muting has problems! Firstly, the arcade buttons are always going to fire an output. I thought it would be nice to simply press "Alt" + the arcade button of that channel. Viola, a mute. But it'd also trigger a beat at the same time. The beat weight feature may be enough but even with a fourth setting with zero tolerance, everything would mute not just one channel. Alt+ the three left buttons might still be the best bet. But some investigation is needed. I was under the impression that the button and CV were multed together. Perhaps all input CV is passed through at a lower voltage? Because the factory firmware still distinguishes between the CV and the button press yet they do share the same digital channel. I don't see how that's possible unless they're actually being read as analog inputs.
Use some sort of LED flashing of the ALT light as well as perhaps a visualization on the orange grid about the value. Also don't write any value unless the knob was turned. Similarly, the original function should not change once Alt is released unless the knob is turned again. There's some quickly written code in develop right now to do this for clock divide input, but formalize it as a function or class to save memory.
Instead of storing 3 channels on 1 byte of memory, which only uses 3/4 of the byte, it makes more sense to use a byte per channel which can hold up to 4 steps.
A quantized beat is also a less lengthy one. Perhaps Quantize and loop length can live on the same knob as opposites by somehow organizing the selection of beats in the grid creatively. Something like a bayer dithering pattern comes to mind..
Instead of throwing out the slop completely, I'd like to meet qu-bit somewhere in-between completely sloppy beats and perfectly quantized beats. I think that the clock division input will be a good way of doing this. Internally, my plan is to create many beat grids with ever finer divisions. As you record, beats will be added to every layer which will result in finer detailed layers keeping slop and less detailed layers sounding time-quantized. This method will likely also greatly increase the quality of recorded slop since the memory grid can be scaled to match the incoming clock signals.
Storing a large multidimensional array of booleans for the grids was quick and easy but
multiplied out to 3,456 bits which is more than the 2048 (2KiB) of RAM available on the ATMega328.
Thankfully there are 1024 8-bit bytes of EEPROM and the grids needs to be stored anyway, but that will also slow things down. Fix all these at once.
The grid and the clock code are becoming very complex. It would be good to write some unit tests so I know that it's actually doing what it's supposed to do instead of manipulating the main.cpp program or taking over the blinking LEDs all the time
Reading weights from the LEDs is hard to do. There might not be multi-color or anything like that, but at least distinguishing them a little nicer with the least amount of flicker.
I now am more confident that it will be possible to use the tempo cv and knob as the clock input.
bonus points:
write an automated test to make sure that beats are quantized as expected
a Tri-ger must be able to host a Tri+ger and vice versa. Tri+ger must understand the configuration jumpers on the back of the board as well. This issue will track efforts to do that.
not yet identified
While not in record mode or holding ALT, play/pause should simply toggle isPlaying. Be mindful that the state cannot be visualized on the play/pause button itself and that the button and CV jack have OR-like logic. That is, holding the button will stop incoming CV gates.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.