[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[sc-users] [scel] EmacsBuffer



Hi.

EmacsBuffer and the associated Emacs* widget classes are now in CVS.

Here is a piece of example code which creates a 64-step sequencer
for bassdrum/snare tracks complete with a randomize/clear button, a test-play
button for each track, a position indicator and a numer field for changing
BPM.  The time of Emacs-based GUIs for SC has come!  It works!
Just eval the block of code and when the window appears you might try and type:
M-< C-n RET C-u 16 C-f RET C-u 16 C-f RET C-u 16 C-f RET C-a C-n C-u 8 C-f RET ...
(the mouse should also work for (un)setting steps)

If you want to close the "app" again, do the obvious and hit C-x k (or
M-x kill-buffer RET) and the onClose action will be executed...

(
var w, tracks, makeTrack, ruler, setPos, stopped=false;
s.waitForBoot {
	SynthDef("kick1", { arg levK=1, t_trig=0, dur=0.125;
		var kEnv, out;
		var kickEnv;
		kickEnv = Env.linen(0.001, 1.9, 0.099, 1);
		kEnv = EnvGen.ar(kickEnv, 1, doneAction:2, timeScale:dur, levelScale:levK);
		out = Pan2.ar(Decay2.kr(t_trig, 0.005, 0.45,
			FSinOsc.ar(26.midicps, 0.4)+FSinOsc.ar(38.midicps, 0.2)), 0);
		Out.ar(0, out*kEnv);
	}).store;
	SynthDef("snare1", { arg levSn=1, t_trig=0, dur=0.125, panPos=0;
		var snEnv, out;
		var snareEnv;
		snareEnv = Env.linen(0.001, 1.9, 0.099, 1);
		snEnv = EnvGen.ar(snareEnv, 1, doneAction:2, timeScale:dur, levelScale:levSn);
		out = Pan2.ar(Decay2.kr(t_trig, 0.005, 0.25,
			FSinOsc.ar(38.midicps, 0.4)	+ BrownNoise.ar(0.5)),
			panPos);
		Out.ar(0, out*snEnv);
	}).store;
};
w=EmacsBuffer("*Smack*");
ruler=EmacsText(w, String.fill(64,$ ), 64);
w.newline;
setPos={|i|ruler.string=String.fill(i,$ )++"|"++String.fill((64-i)-1,$ )};
makeTrack={|defName|
	var track;
	track=Array.fill(64, {EmacsButton(w,[" ","="],prefix:"", suffix:"")});
	w.insert(" ");
	EmacsButton(w,["r","C"],{|v|track.do{|b| b.value=if(v==1){2.rand}{0}}});
	EmacsButton(w,[defName],{Synth.grain(defName, [\t_trig, 1])});
	w.newline;
	track
};
tracks=#[
	["kick1"], ["snare1"]
].collect{|patchInfo| patchInfo++makeTrack.value(*patchInfo) };
EmacsNumber(w,"BPM",ControlSpec(1,300),{|bpm|Tempo.bpm=bpm},Tempo.bpm);
w.onClose={stopped=true};
r{w.focus;inf.do{
	64.do{|i|
		setPos.value(i);
		tracks.do{|track|if (track[i+1].value==1) {Synth.grain(track[0],[\t_trig, 1])}};
		if(stopped){^nil}{(4/64).wait}
	}}}.play(TempoClock.default);
)

-- 
CYa,
  Mario