LNX studio poll results

Experience using LNX studio (check all that apply)
  • Never heard of LNX.
  • Never used LNX.
  • Currently unable to use LNX.
  • I think LNX is confusing.
  • I think LNX, has too many bugs.
  • I think LNX is an impressive project.
  • I rarely use LNX.
  • I occasionally use LNX.
  • I often use LNX.
  • I use LNX as my primary composition tool.
  • I use LNX more than SC.
  • I use LNX more than any other DAW.
  • I haven’t composed any music in LNX.
  • I am currently in the process of composition using LNX.
  • I have created more than one track using LMX.

0 voters

Is it an abandoned project? The home page has been saying (Linux - Alpha release out soon) for the last five years.

At one point some 5 years ago I was really looking forward to trying it, but by now I had almost forgotten about its existence. It does appear to have a lot of widgets that would be very interesting if they were usable outside LNX as well (e.g. piano roll editor).

My understanding is that yes, it is abandoned. Quite a shame because I find the idea of an open-source DAW where every element is programmable in text very appealing.

It seems like there is a newer, similar project out there, also using SC, called TX Modular. Last time I tried to use it, I found it a little confusing, but maybe I just didn’t give it enough time. I’m really hoping one of these projects takes off, or that someone makes a SuperCollider VST wrapper that I can use in any DAW (something like Protoplug or ReaJS).

1 Like

I was able to open LNX in Mac OS X Lion… maybe… 3 years ago? … Everything worked as it should, if I recall… I was simply more involved in my own work at the time.

My guess is, development surely would’ve continued, had their been amy sort of promising response from the community

It seems almost hard to believe… a full-featured DAW writen in entirely in SuperCollider, integrated networking for collaborating with other artists, and sounds far from unimpressive…

So what’s the true verdict… shouldn’t we all be making tracks in this, collaborating and live steeaming over its network, uploading projects, or perhaps even creating a movement that expands beyond SC… begins to compete with Ableton, Reaper, etc… catching glimpses the news / media, getting more & more people interested and contributing to the source and talent of this community?

What’s really preventing us from creating the best of both worlds … Ableton & SC, into one utimate force or superpower? …

I know VST is a must, if LNX was more widely used… we’d potentially design more open-source LNX Studio effects, for the expansion of possibility in music & synthesis, than there are expensive presets for plugins like Serum M4L etc.

1 Like

I think it’s still being developed:

last commit 27 days ago

I’ve tried to run it on linux a few years ago,
to no avail.

You might reach out to the developer!

the xplat osx seems the most promising, the master & dev branches haven’t been touched since 2016

Readme.md (master branch) claims Linux and Windows are still in development… and so LNX is still currently Mac OSX only, but the installation process is pretty straightforward… nearly as much as most OSX apps.

LNX also contains several custom interfaces, supporting a number of classics:

Moog Sub 37

an interface for the Moog Sub 37 synthesiser.

Roland JP-08

an interface for the Roland JP-08 synthesiser.

Korg Volca Bass

an interface for the Korg Volca Bass synthesiser.

Korg Volca Beats

an interface for the Korg Volca Beat drum machine.

Korg Volca Keys

an interface for the Korg Volca Keys synthesiser.

hello there. I use lnx and i think it absolutely deserves to be looked at seriously, both as a way to make music with SC and as a fine example of what kinds of larger projects are possible with SC.

It runs on linux fine, but you’ve got to make sure you got the ‘xplat’ branch.

It is really too small to use on hiDPI screens, so i added this snippet before the call to sclang in the LNX_Studio script to scale the GUI:

QT_SCREEN_SCALE_FACTORS=2 QT_QPA_PLATFORM=xcb

The best thing about LNX to me has to be LNX_code, where you get an instant gui/sequencing, buses etc for code snippets with very little editing.

1 Like

I can confirm,
just got it running on linux too.

There have been fixes committed in 2019 on the linux branch.

Hiya everyone,

thanks for all the interest in LNX even though its been several years since I’ve done anything public with it or said anything about it. i’m happy to share some of what I’ve been up to and thinking about.

is LNX dead? I’m not sure, it’s a project I put a lot of time into over a 10 year period and i just got fatigued with it. my day job starting asking more of me and I got back into gaming to help me escape. All my free time disappeared so i had a year or 2 off.

Since then I’ve made several different instruments / projects in it for my own music but i haven’t bothered to publish them. one of which is a substantial module and not on git hub. its a new way to analysis and re-synthesise audio that is musically interesting. its what i used to make the 2 albums on bandcamp… https://neilcosgrove.bandcamp.com

i’ve also made a 2d game engine that closely couples with LNX_Studio. the engine is optimised for supercollider and does all sorts of things. World terrain generation, collision detection + responses, assets, maps, entities, lighting, tiles, items, ps4 controller input and the control and exchange of information between the game world & LNX. I’ve even made a platformer game with it. i don’t know why i did all this but it was fun.

i think it would be nice to make a VST plugin instrument / fx at some point too.

my development time with LNX has in the past being about exploring ideas i find exciting and the idea of having lots of users a little scary.

The current version I have running on my mac is a standalone QT App + all the extras above. Its running on SC version 3.8 so it’s a little old. It would need updating to the latest version which would be a bit work. My friend used to do all the linux stuff for me but thats not the case anymore.

As it stands i still use it and i still write code for it but getting the right work life vs coding vs music making vs relaxing is important to me and I can’t commit the +15 hrs a week I used to put into it. that being said its been nice to have the break but maybe i will put some more time in.

10 Likes

Mad Respect !!!

Stay legend .

You have our full support .

So good project! Good job

Huge respect @neilcosgrove !

My opinion is that LNX studio implements several crucial features that SC is missing somehow: New modern GUIs, more flexible piano roll, daw features, visualization features, etc… In my practice, if it would be possible to ship SC with LNX features or ship full LNX having also all SC capabilities any options would be a working dream. It would facilitate a lot the collaborative work with musicians which does not have strong computer skills, would facilitate practices that mix code and visual/DAW style, would facilitate teaching, etc.

I still think that an important step for SC community is to have some kind of crowdfunding. Several excellent projects are dying because of the same problem. I know this crowdfunding idea has never took off properly but maybe some of the devs can begin one (focused on a specific project) to see how much we can raise and if it is enough.

2 Likes

lnx studio from github works on linux if you use the xplat branch. this comes with the caveat that it provides everything, but you have to manually set a couple of things up, which means mostly to edit some paths. together with pipewire this is fantastic. I also added this line to the executable to scale the ui:
QT_SCALE_FACTOR=1 QT_AUTO_SCREEN_SCALE_FACTOR=0 QT_SCREEN_SCALE_FACTORS=2 QT_QPA_PLATFORM=xcb

if you have VSTPlugin installed, save this as LNX_VSTi.sc in lnx studios own
‘SCClassLibrary/LNX_Studio Library/2. Instruments’ to get started.
Also edit sclang_conf_lnx.yaml to include the VSTPlugin extension.
It works on my machine :slight_smile:

LNX_VSTi : LNX_InstrumentTemplate {
	var <vsti, <proxy;

	*new { arg server=Server.default,studio,instNo,bounds,open=true,id,loadList;
		^super.new(server,studio,instNo,bounds,open,id,loadList)
	}

	*studioName {^"VSTi"}
	*thisWidth  {^200} // the default width of this instrument
	*thisHeight {^100} // the default height of this instrument
	*sortOrder{^10}
	*isVisible{^true}

	isInstrument{^true}
	canBeSequenced{^true}
	isMixerInstrument{^true}

	mixerColor{^Color(1,1,1,0.4)} // colour in mixer

	canTurnOnOff{^true}
	hasMIDIClock{^false}
	clockPriority{^5} // order for clock beats. sequenced controllers 1st. instruments last.
	// the lower the number the higher the priority

	// this line is important for mixer instruments!
	hasLevelsOut{^true}

	interface{^nil} // supply an immutable list of methods to make available to the network

	header { // define your document header details
		instrumentHeaderType="SC Template Doc";
		version="v1.1";
	}

	initModel {
		#models,defaults=[
			// 0.solo
			[0, \switch, (\strings_:"S"), midiControl, 0, "Solo",
				{|me,val,latency,send,toggle| this.solo(val,latency,send,toggle) },
				\action2_ -> {|me| this.soloAlt(me.value) }],

			// 1.onOff
			[1, \switch, (\strings_:((this.instNo+1).asString)), midiControl, 1, "On/Off",
				{|me,val,latency,send,toggle| this.onOff(val,latency,send,toggle) },
				\action2_ -> {|me| this.onOffAlt(me.value) }],

			// 2.amp
			[ \db6, midiControl, 2, "Amp",
				(mouseDownAction_:{hack[\fadeTask].stop}),
				{|me,val,latency,send|
					this.setPVP(2,val,latency,send);
					this.setMixerSynth(\amp,val.dbamp,latency); // set mixer synth
			}],

			// 3. master pan
			[\bipolar, midiControl, 3, "Pan", (\label_:"Pan", zeroValue_:0),
				{|me,val,latency,send|
					this.setPVPModel(3,val,0,send);      // set p & network model via VP
					this.setMixerSynth(\pan,val,latency); // set mixer synth
			}],

			// 4. peak level
			[0.7, \unipolar,  midiControl, 4, "Peak Level",
				{|me,val,latency,send| this.setPVP(4,val,latency,send) }],

			// 5. out channels
			[0,\audioOut, midiControl, 5, "Output channels",
				(\items_:LNX_AudioDevices.outputAndFXMenuList),
				{|me,val,latency,send|
					var channel = LNX_AudioDevices.getOutChannelIndex(val);
					this.setPVPModel(5,val,0,send);     // set p & network model via VP
					this.setMixerSynth(\outChannel,channel,latency); // set mixer synth
				}],

			// 6. main send channel
			[-1, \audioOut,  midiControl, 6, "Main Send Channel",
				(\items_:LNX_AudioDevices.outputAndFXMenuList),
				{|me,val,latency,send|
					var channel = LNX_AudioDevices.getOutChannelIndex(val);
					this.setPVPModel(6,val,0,send);             // set p & network model via VP
					this.setMixerSynth(\sendChannel,channel,latency); // set mixer synth
			}],

			// 7. main send amp
			[-inf, \db2,  midiControl, 7, "Main Send Amp", (label_:"Send"),
				{|me,val,latency,send|
					this.setPVPModel(7,val,0,send);             // set p & network model via VP
					this.setMixerSynth(\sendAmp,val.dbamp,latency); // set mixer synth
			}],

			// 8. syncDelay
			[\sync, {|me,val,latency,send|
				this.setPVPModel(8,val,latency,send);
				this.syncDelay_(val);
			}]
		].generateAllModels;

		presetExclusion=[0,1];
		randomExclusion=[0,1];
		autoExclusion=[];
	}

	// return your output model, for fadeIn, fadeOut, and Mixer
	peakModel    {^models[4]}
	volumeModel  {^models[2]}
	outChModel   {^models[5]}
	soloModel    {^models[0]}
	onOffModel   {^models[1]}
	panModel     {^models[3]}
	sendChModel  {^models[6]}
	sendAmpModel {^models[7]}
	syncModel {^models[8]}

	//// GUI ///////////////////////////////////////////

	createWindow{|bounds|
		this.createTemplateWindow(bounds,Color(0.1,0.1,0.1,1));
	}

	createWidgets{
		gui[\topLevel]=MVC_RoundedCompositeView(window, window.bounds);

		MVC_FlatButton2(window, Rect(10, 10, 85, 30))
		.strings_(["gui"])
		.action_({ vsti.gui });
		MVC_FlatButton2(window, Rect(105, 10, 85, 30))
		.strings_(["editor"])
		.action_({ vsti.editor });

		// MIDI Settings
		MVC_FlatButton(window,Rect(10, 50, 85, 30),"MIDI")
		.rounded_(true)
		.canFocus_(false)
		.shadow_(true)
		.color_(\up,Color(10665/19997,223/375,2/3) )
		.color_(\down,Color(10665/19997,223/375,2/3) )
		.color_(\string,Color.white)
		.resize_(9)
		.action_{ this.createMIDIInOutModelWindow(window, //,low:11,high:12,
			colors:(border1:Color(0,1/103,9/77,65/77) , border2:Color(59/108,65/103,505/692))
		) };

		// MIDI Control
		MVC_FlatButton(window,Rect(105, 50, 85, 30),"Cntrl")
		.rounded_(true)
		.canFocus_(false)
		.shadow_(true)
		.color_(\up,Color(10665/19997,223/375,2/3) )
		.color_(\down,Color(10665/19997,223/375,2/3))
		.color_(\string,Color.white)
		.resize_(9)
		.action_{  LNX_MIDIControl.editControls(this); LNX_MIDIControl.window.front  };
	} // put your GUI code in here

	//// uGens & midi players //////////////////////////

	// this will be called by the studio after booting
	*initUGens{|server|

		SynthDef(\vsti, { arg out = 0;
			// VST instruments usually don't have inputs
			Out.ar(out, VSTPlugin.ar(nil, 2))
		}).add.send(server);
	}

	// startDSP  : this is called once to start ugens at instrument creation
	// stopDSP   : and once to stop ugen when the instrument is deleted
	//             used to start & stop fx's or mono synths
	// updateDSP : and also update synth parameters in a load
	startDSP  {
		synth = Synth.new(\vsti, [\out, this.instGroupChannel], instGroupID);
		vsti = VSTPluginController(synth);
		proxy = vsti.midi;
		vsti.browse;
	}
	stopDSP   { synth.free; vsti = proxy = nil; }

	updateDSP{|oldP,latency|
		synth.set(\out, this.instGroupChannel);
		this.setMixerSynth(\sendChannel,LNX_AudioDevices.getOutChannelIndex(p[6]),latency); // set mixer synth
		this.setMixerSynth(\outChannel, LNX_AudioDevices.getOutChannelIndex(p[5]),latency); // set mixer synth
	}
	replaceDSP{} // to be used by synth's or fx's that need to replace the current
	// synth with a new one in order to update values

	// midi In methods, latency is supplied
	noteOn	{|note, vel, latency| proxy.noteOn(0, note, vel)}		// noteOn
	noteOff	{|note, vel, latency| proxy.noteOff(0, note, vel)}		// noteOff
	control	{|num,  val, latency| proxy.control(0, num, val)}		// control
	bend 	{|bend     , latency| proxy.bend(0, bend)}		// bend
	touch	{|pressure , latency|}		// pressure
	program	{|program  , latency|}      // and program (the selectProgram method is called 1st
	sysex	{|data     , latency|}
	midiInternal{|command,arg1,arg2| }   // internal comms via midi (not used yet)

	// a quick way to get working, to be used by all midi in future
	pipeIn{|pipe|
		switch (pipe.kind)
		{\noteOn} { // noteOn
			this.noteOn(pipe.note, pipe.velocity, pipe.latency)
		}
		{\noteOff} { // noteOff
			this.noteOff(pipe.note, pipe.velocity, pipe.latency)
		}
		{\control} { // control
			this.control(pipe.num, pipe.val, pipe.latency)
		}
		{\bend} { // bend
			this.bend(pipe.val, pipe.latency)
		}
		{\touch} { // touch
			this.touch(pipe.pressure, pipe.latency)
		}
		{\program} {
			// to do and confirm
		}
	}
} // end ////////////////////////////////////
1 Like