MUFF WIGGLER Forum Index
 FAQ & Terms of UseFAQ & Terms Of Use   Wiggler RadioMW Radio   Muff Wiggler TwitterTwitter   Support the site @ PatreonPatreon 
 SearchSearch   RegisterSign up   Log inLog in 
WIGGLING 'LITE' IN GUEST MODE

Sample playback, what are the limits?
MUFF WIGGLER Forum Index -> nw2s  
Author Sample playback, what are the limits?
Alwaysnew
I'm amazed by the sound quality of the sample playback!

What would the limits be for messing with the samples? I guess a bottleneck would be what the processor could handle...

Would it technically be possible to trigger different samples by sending signals to the digital ins? either one shot or play-for-as-long-as-the-input-is-high?

Would it be possible to set an analog in for deciding start place and end place in the sample played?

If not, would it be possible to upgrade the hardware in any way to make it possible?

This all would be a dream to me!
scottwilson
For signal processing the samples, yes, the limit would be the processor. There are some things that would be relatively easy like bit reduction that I haven't done yet, but anything positional (time based) is very easy which I have done with the glitching. However, with a modular, if you want to do any filtering or distortion, then I assume you have plenty on hand to handler that in the analog domain.

Yes, it's possible to trigger different samples. It's not anything i've built yet, but is certainly possible and would be pretty easy extending what's there. When I get the monome integration a little further, that could even be a good trigger map to provide more than 8 different samples.

Also, yes, it would be pretty trivial to use an analog in to determine the start point and end points.

I've added these as feature requests on github if you want to watch them, otherwise, I'll update this thread when I get them done.

There is already a fair amount of sampler functionality added to the 1.1 codebase or slated to be added to 1.1, so keep an eye out!

s
Alwaysnew
Very very nice!

I'm still struggling a bit trying to make the SD play in a setup like this one:

https://github.com/Magnus-G/nw2sFrameworkControl

I guess I'd want to be able to do things such as:

- send a trig or gate to digital in 1 to play sample 1 (and so on for 2,3,4...)
- use pot1 to set start place in sample 1 (and so on for 2,3,4...)
- use pot2 to set stop place in sample 1 (and so on for 2,3,4...)
- use other pots for bitcrush, pitch and what not!

I wonder if it would be possible to extract those parameters to a C-like environment, kind of like we did for the repo above?
scottwilson
Yes, it's perfectly doable in C, however, this is the most complicated of all of the devices that I've built, and it will be a fair amount of work.

All of the code is in Loop.cpp, so technically you could pull it all out, but there's a couple of complications that make this different from just millisecond precision CV generation.

https://github.com/nw2s/b/blob/master/sketches/libraries/nw2s/Loop.cpp

The first complication is that the code is interrupt based - you have to set up a timer that fires once every XX,000 times a second. On the ARM Cortex, these interrupts are stateless (technically they are static) - meaning that something happens, but you have no context of, for example _which_ sampler's interrupt fired if you are running two different outputs.

The second complication is related, but is that you have to think of the code as having two threads. The first thread is the audio output and should manage nothing but getting bytes to the DAC as quickly as possible with as perfect timing as possible. The second thread is a lower priority set of code (it constantly is being interrupted by the first thread) that will read analog inputs, set parameters to your algorithm (start points, bit depth, etc), and reads data from the SD card, placing it on the buffer at just the right speed.

If you want to dig further:

This is the constructor - it sets up the timer based on the sample rate of the clip you want to play:

Looper::Looper(PinAudioOut pin, char* subfoldername, char* filename, SampleRateInterrupt sri)

This is the interrupt handler - it writes the next sample to the DAC:

void Looper::timer_handler()

Then the low-priority code starts here:

void Looper::timer(unsigned long t)
Alwaysnew
Wow, that sounds fairly complex!

If it would be possible to do something like

int sampleLength = 100;
int startPosition = 0;
int stopPosition = 100;
int samplePitch = ?; // preferably according to the 1v/oct so you could "play the sample"

and then mess with those parameters with analogIns, that would be SO amazing!

Do you think that would be possible at some point?
scottwilson
yeah - except for the pitch, that would be possible.

The pitch is a bit more difficult than the others since for a 20kHz sample, you could really only get an octave out of it before you ran out of bandwidth reading from the SD card. However, as long as you didn't mind limiting your self to about that range, then it could work to a degree.

My influence on the sampler features has been the Rachmiel instruments in Reaktor which are great and translate well to analog.

Anyway, I'll let you know when I get to add a couple of those other parameters to the looper.

s
Alwaysnew
A thing I forgot was being able to trigger 8 different samples with the 8 digital ins! that would be amazing and something similar to what the Addac Ultra Wav Player can do.

I could see the processor getting a bit sad when you try to play 8 samples at the same time in audio rate though! hyper
MUFF WIGGLER Forum Index -> nw2s  
Page 1 of 1
Powered by phpBB © phpBB Group