MmmTsss playful looper

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?)

Okay, here’s the web page:
http://web.mit.edu/~eric-r/Public/mmmtsss/

Here’s the source, in its xcode form, built using of 0.05:
http://web.mit.edu/~eric-r/Public/mmmts-…–xcode.zip

(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

thats really cool!!!

dang! I am on a macbook/leopard … the weird thing is that the click noise does not even respond to changing the system volume.

Really great stuff!

I just tried it on windows and it’s a lot of fun and simple to use! =)

I can’t wait to see some code sometime. Keep up the good work!

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;  
				}  
			}  
		}  
	}  
}  
  

Hello!

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.

Thanks in advance,
Kalle