I’m working on MmmTsss, a playful musical looping app, and I’d love your feedback on it.
MmmTsss was born at the of knitting circle at eyebeam in march, where it made me very happy to be able to make a simple looper within a couple of hours. Since then I have been adding features and visualizations, but trying to keep it as simple and easy to use as I can.
Right now it lets you record a bunch of tracks in layers, see them in real time in a circular visualization, move in and out between the layers, change their amplitude, and change the tempo (resulting in pitch shift). There’s a click track which plays even while you record, but the recording “ducks” it to avoid feedback. There’s even a little suggestion system, in case you’re out of ideas for new mouth noises.
I’ve compiled it for mac and windows, and made a little web page for it. I’d love to hear any feedback you have, but especially:
if it doesn’t work… bummer. what’s your setup?
are you getting decent framerates (framerate is shown in the lower right)?
suggestions for features or UI improvements?
Here are some known issues so far:
under some conditions buffers are dropped resulting in glitchy audio
on a macbook running OS 10.5, clicks play but not recorded audio (but recorded waveform shows up!)… weird.
on some windows machines, click feedback removal does not work (different latencies?)
(incidentally- compiling on windows I had to change all references to ofVec3f to ofxVec3f. I think I’m using 0.05 in both places, but downloaded a few months apart… any ideas?)
Here’s a youtube video (same video as shown on the webpage above- this was made with an earlier version of mmmtsss): http://youtube.com/watch?v=FPMTtxrS2v4
I’d like to figure out this issue on leopard where the clicks are playing but not the recorded sounds (btw the recorded sounds are appearing in the UI, so it’s definitely a problem in playback).
I’m not sure where to start and this is hard for me to debug. So… here is the entirety of my audioRequested function. Sorry it’s a bit ugly. Maybe somebody will look at this and say “aha!”
void testApp::audioRequested (float * output, int bufferSize, int nChannels){
// if there's something in the loop (i.e. it has not been cleared)
if (recordingLength > 0) {
// if we're not recording
// play back the loop + click track
if (!recording) {
// loop over the buffer of samples
for (int i = 0; i < bufferSize; i++) {
// increment the sample counter
sampleCounter++;
if (sampleCounter > recordingLength) {
sampleCounter = 0;
}
if (currentTrack != -1) {
// if we're on a buffer where we should hear a click
// spit out the click only
for (int j=0; j < NUM_BEATS; j++) {
if (sampleCounter == clickSamples[j]) {
//printf("click\n");
for (int k = 0; k < bufferSize; k++) {
output[k] = clickBuffer[k];
}
return;
}
}
// sum the samples in all the tracks up to the current one
// and send the sum out as output
//
output[i] = 0;
for (int j = 0; j <= currentTrack; j++) {
output[i] += sample[j][sampleCounter];
}
}
}
}
// if we are recording
if (recording && currentTrack != -1) {
clickDelay--;
if (clickDelay < 0) {
clickDelay = 0;
}
for (int i = 0; i < bufferSize; i++) {
// increment the sample counter
sampleCounter++;
if (sampleCounter > recordingLength) {
sampleCounter = 0;
}
// send out the click
for (int j=0; j< NUM_BEATS; j++) {
if (sampleCounter == clickSamples[j]) {
clickDelay = 5;
//printf("rec click\n");
for (int k = 0; k < bufferSize; k++) {
output[k] = clickBuffer[k];
}
}
}
}
// rewind sampleCounter, since we're both recording and playing
for (int i = 0; i < bufferSize; i++) {
sampleCounter--;
if (sampleCounter < 0) {
sampleCounter = recordingLength;
}
}
}
}
}
I stumbled upon your nice little program, which I could really use as kick-start for a similar project of mine.
Unfortunately, the source link is broken. Well, it’s been a long time.
Would be great, if you could post it here.