Hi All!
With recent changes in the world of live looping software I've decided to open my private repo of Luppp.
The Luppp project has been one of my main occupations over the last
couple of years, and I've tought myself C++ programming while working on
it. Its a live looping instrument with similar features to the well
known software Ableton Live, and more recently Bitwig studio. I feel the
live workflow available with such programs is something the Linux Audio
community would also benefit from, and hence it will be released under
the GPL license, version 3.
Its current state is that most "basic" functionality is in place:
Loading, playing back & recording of loops works, effects can be
added to these audio streams, and later they are mixed. A basic config
file is used to store information about loops, and hence Luppp can make
more informed decisions how to use loops.
This is pre-alpha software, as not all features to fullfill alpha state
are implemented. On the other side, most features currently available
are quite stable (on my local machine anyway :)
I would like to announce that I will continue to work on the Luppp project myself, but that I do also welcome input / testing / help from other developers. I am aware that there are some basic enough flaws in the program in its current state, however these are also the primary items on my TODO list.
Remember its pre-alpha, please keep that in mind :)
Git source repo: https://github.com/harryhaaren/Luppp
ZIP of master branch: https://github.com/harryhaaren/Luppp/zipball/master
If you're intrested in working on Luppp, have a feature request, have ideas, time, or want to build Luppp a website, feel free to get in contact!!
Cheers, -Harry
Mandatory screenshot (note your GTK theme will influence its looks, this is on the todo! ):
A blog dedicated to Linux Audio. Some Programming tutorials will be posted, some howTo articles for using certain features of a program, or just my own thoughts/options on any topic.
Saturday, January 14, 2012
Monday, December 19, 2011
Tutorial: Load & Loop Samples
Hey all,
This tutorial will show you how to load a sample into memory, and then play it back trough a JACK port, continually looping. There's not really that much to it, just a bit of thinking of the order things happen, and arrays.
If you've read the "Writing a sample" tutorial, you'll already be familiar with LibSndFile, the library we use to read / write samples, so there's nothing too hard to handle :)
Check out the source here: https://github.com/harryhaaren/Linux-Audio-Programming-Documentation/blob/master/loopedSample/loopedSample.cpp
Any queries / suggestions, you know how to get to me :) -Harry
This tutorial will show you how to load a sample into memory, and then play it back trough a JACK port, continually looping. There's not really that much to it, just a bit of thinking of the order things happen, and arrays.
If you've read the "Writing a sample" tutorial, you'll already be familiar with LibSndFile, the library we use to read / write samples, so there's nothing too hard to handle :)
Check out the source here: https://github.com/harryhaaren/Linux-Audio-Programming-Documentation/blob/master/loopedSample/loopedSample.cpp
Any queries / suggestions, you know how to get to me :) -Harry
Saturday, December 17, 2011
Arch Linux : The quest for a minimal system with maximal RT performance
Hey All,
My install of TangoStudio is getting old, and its repos are getting polluted with conflicts & nastiness, that means a reinstall! So a quick bit of searching for a minimal yet configurable, RT capable and rock-solid led to some intresting distro choices.
TangoStudio - Worked well enough ( 30ms lowest lat on stock kernel )
64Studio - a touch oudated by now, but it was always very good
Pure::Dyne - personal favorite for a while, also gone a touch out of date
Gentoo - probably not good for a non-kernel hacker type... but then
Arch has been a distro I've tried a couple of times because I love the sound of it:
So off I went, download the 380mb ISO, install it on a seperate partition, get going. You get a minimal system that drops to a root prompt on install, and "startx" isn't going to help much untill you install you video driver packages etc. Note this can be done during install but I opted not to, as I wanted the control to select only needed packages.
So after a bit of haggling with the X server, reading some wiki entries using the text only webbroswer links, and installing the "slim" display manager, messing with /etc/inittab and ~/.xinitrc there's a system up and running, straight to a graphical logic screen (with awesome "darch-white" theme") and then to a barebones LXDE desktop with OpenBox as WM.
The speed of the menu's & actions in unreal, it feels like its there before you clicked. Some small issues with ugly themes and nasty font's were quickly ironed out using lxapperance.
Couple of "nasty" little things:
-Hotkeys: https://wiki.archlinux.org/index.php/Xbindkeys
-Keymap: https://wiki.archlinux.org/index.php/loadkeys
-Touchpad: https://wiki.archlinux.org/index.php/Touchpad
Then on to the audio side of things:
There's a project called ArchAudio, who are maintaining lots of up to date software for audio / multimedia purposes, you'll want to install that repo:
http://archaudio.org/packages/ has all the info you'll need!
I'm a JACK1 user, so first thing I wanted to do was install that:
the "Extra" repository has a build of 0.121.3, so a simple pacman -S extra/jack1 done the trick. FFADO installation for my Echo AudioFire was quick and painless: pacman -S libffado That installs your needed library, the ffado-mixer, ffado-test etc programs, and sets up the privelidges so that you can run JACK in RT mode.
If you want to use this install as your "daily", you'll need to install a mountain of stuff, things like gtkmm,flashplayers, media players, codecs, etc. But if you want to run audio... no need. Actually you'd be better off without that stuff.
The end result:
A system that will run JACK @ 4ms latency, 192kHz samplerate, with a *non-RT* kernel. That's currently still compiling, and I'm hoping to squeeze another ms or 2 off the RT_PREEMPT & IRQ tuning (& IRQ threading.. but that's dangerous territory AFAIK!)
So far I'm very satisfied with Arch and its amazing documentation :)
Will keep this up to date with the RT kernel progress & latency tuning,
-Harry
My install of TangoStudio is getting old, and its repos are getting polluted with conflicts & nastiness, that means a reinstall! So a quick bit of searching for a minimal yet configurable, RT capable and rock-solid led to some intresting distro choices.
TangoStudio - Worked well enough ( 30ms lowest lat on stock kernel )
64Studio - a touch oudated by now, but it was always very good
Pure::Dyne - personal favorite for a while, also gone a touch out of date
Gentoo - probably not good for a non-kernel hacker type... but then
Arch has been a distro I've tried a couple of times because I love the sound of it:
Arch Linux, a lightweight and flexible Linux® distribution that tries to Keep It Simple.However any time I tried it I had been put off by its "initial configuration" that needs doing before you can get yourself online to look at some forums / wiki's for help!
So off I went, download the 380mb ISO, install it on a seperate partition, get going. You get a minimal system that drops to a root prompt on install, and "startx" isn't going to help much untill you install you video driver packages etc. Note this can be done during install but I opted not to, as I wanted the control to select only needed packages.
So after a bit of haggling with the X server, reading some wiki entries using the text only webbroswer links, and installing the "slim" display manager, messing with /etc/inittab and ~/.xinitrc there's a system up and running, straight to a graphical logic screen (with awesome "darch-white" theme") and then to a barebones LXDE desktop with OpenBox as WM.
The speed of the menu's & actions in unreal, it feels like its there before you clicked. Some small issues with ugly themes and nasty font's were quickly ironed out using lxapperance.
Couple of "nasty" little things:
-Hotkeys: https://wiki.archlinux.org/index.php/Xbindkeys
-Keymap: https://wiki.archlinux.org/index.php/loadkeys
-Touchpad: https://wiki.archlinux.org/index.php/Touchpad
Then on to the audio side of things:
There's a project called ArchAudio, who are maintaining lots of up to date software for audio / multimedia purposes, you'll want to install that repo:
http://archaudio.org/packages/ has all the info you'll need!
I'm a JACK1 user, so first thing I wanted to do was install that:
the "Extra" repository has a build of 0.121.3, so a simple pacman -S extra/jack1 done the trick. FFADO installation for my Echo AudioFire was quick and painless: pacman -S libffado That installs your needed library, the ffado-mixer, ffado-test etc programs, and sets up the privelidges so that you can run JACK in RT mode.
If you want to use this install as your "daily", you'll need to install a mountain of stuff, things like gtkmm,flashplayers, media players, codecs, etc. But if you want to run audio... no need. Actually you'd be better off without that stuff.
The end result:
A system that will run JACK @ 4ms latency, 192kHz samplerate, with a *non-RT* kernel. That's currently still compiling, and I'm hoping to squeeze another ms or 2 off the RT_PREEMPT & IRQ tuning (& IRQ threading.. but that's dangerous territory AFAIK!)
So far I'm very satisfied with Arch and its amazing documentation :)
Will keep this up to date with the RT kernel progress & latency tuning,
-Harry
Labels:
arch audio,
arch linux,
JACK,
linux audio distro,
realtime
Wednesday, November 16, 2011
Tutorial: JACK Ringbuffers
Hey All,
A quick tutorial on basic Jack ringbuffer usage. Ringbuffers are an easy way to exchange data from one thread to another in a realtime safe way. This means that no thread will block when reading or writing, and hence you use ringbuffers in a real-time thread.
For this tutorial I'll be using the "standard" linux audio ringbuffer that comes with JACK. Its docs are available here: http://jackaudio.org/files/docs/html/ringbuffer_8h.html
So what were going to do is:
1. Setup a ring buffer
2. Register a JACK client, and give it a process callback
3. Write data in the "local" thread, ie: our main()
4. Make JACK print out any data it recieves in its RT thread
Note that here the JACK thread is our READ thread , and the main() thread is the WRITE thread. This is important, because a ringbuffer like the JACK one will only work in ONE direction.
Find the well commented source here: https://sites.google.com/site/harryhaaren/Home/main.cpp
Note the compile command is: g++ main.cpp `pkg-config --cflags --libs jack` (its also in the source.. but just to make sure :)
Responses welcome, -Harry
PS: Note there are many different implementations of ringbuffers, all with benefits of their own. The JACK ringbuffer is a simple and IMO easily usable one, and that's the reason I like it. I don't want a fancy impossible multi-read multi-write templated 13 class derived special oval ringbuffer, just something that does what it says on the tin :)
A quick tutorial on basic Jack ringbuffer usage. Ringbuffers are an easy way to exchange data from one thread to another in a realtime safe way. This means that no thread will block when reading or writing, and hence you use ringbuffers in a real-time thread.
For this tutorial I'll be using the "standard" linux audio ringbuffer that comes with JACK. Its docs are available here: http://jackaudio.org/files/docs/html/ringbuffer_8h.html
So what were going to do is:
1. Setup a ring buffer
2. Register a JACK client, and give it a process callback
3. Write data in the "local" thread, ie: our main()
4. Make JACK print out any data it recieves in its RT thread
Note that here the JACK thread is our READ thread , and the main() thread is the WRITE thread. This is important, because a ringbuffer like the JACK one will only work in ONE direction.
Find the well commented source here: https://sites.google.com/site/harryhaaren/Home/main.cpp
Note the compile command is: g++ main.cpp `pkg-config --cflags --libs jack` (its also in the source.. but just to make sure :)
Responses welcome, -Harry
PS: Note there are many different implementations of ringbuffers, all with benefits of their own. The JACK ringbuffer is a simple and IMO easily usable one, and that's the reason I like it. I don't want a fancy impossible multi-read multi-write templated 13 class derived special oval ringbuffer, just something that does what it says on the tin :)
Labels:
c++,
JACK,
multithreading,
ringbuffer,
tutorial
Wednesday, September 21, 2011
Luppp : 30,000 loc
Somewhere yesterday Luppp passed the 30 k lines mark, currently on 30, 255. There's been quite some UI work going on, as well as some (essential) features being implemented in the engine... full update soon :)
Monday, September 5, 2011
Project Piano
After a bit of googling and checking websites I found one that had all the Broadwood serial numbers, and I checked up what its approximate build year was: 1907. That makes her 104 years old :) It seems that the convent in Clonmel bought the piano new, and used it there until they were recently donated new Roland digital pianos, hence this was being thrown out. Some kind folks took it home instead of letting it be thrown in the skip, and they popped it up on adverts which took her to Co Clare.
Everybody that tuned the piano seems to have signed a key: perhaps this is a trait like a mechanic marking when the timing-belt has been done ;)
Today was spent just cleaning it up a bit: there was quite some dust, some spiders, spiderwebs etc, that's all gone. Next up was to take off the action, and the remove the keys.
Each key got a good cleaning with some ivory-friendly cleaning agent, and was then allowed dry off.
Got a good look at the case under the keys didn't show any signs of the wood being worn, so there isn't any need for structural woodworking. Delighted: restoring the action case would have been quite some work.
Then to putting the keys back on, and making them all sit right. A couple of the keys action wasn't smooth enough to lift the key once the hammer's pressure was on it, so some of the pins were bent back into place, a coulpe of others needed a bit of a twist to make it fit.
Once all back in place, it was time to get the tuning gear, and get going. By then end of the day the A's and G's were pretty ok.. even though when I'm next at it, it will probably have sagged enough to not notice much.
That's all for now!
Sunday, August 21, 2011
Luppp: Progress, demo song & video
Hey,
The past while has seen quite some work being done, on various parts that needed attention: the UI, some internal effects & support for instruments, and better LV2 support. Also there's a "scene" thing come into play...
UI wise there's a mechanism in place that will "Osc Blob" send the nessisary information from the Engine, and it plots the wave shape on screen.
For instruments & effects we can now load PureData patches, and communicate with them using the JACK MIDI port. There isn't a lot of "routing" available, its all hard coded CC values at the moment, but that's on a todo list somewhere...
The Lv2 side of things has seen some changes, like a system whereby the Engine dynamically updates the UI of which plugin is loaded where, as well as where it can find the binary files to instantiate the corresponding plugin UI.
Finally the "Scene" thing, basically its a way to organize a song or structure audio clips into groupings that can be played back simultaneously.
So here we have a blank session with 5 "tracks" or "loopers", each track complete with plugin slots, solo mute buttons, a pitch slider (left), and a volume slider (right) and 2D ambisonic panner.
In the scene selector we see each buffer is currently green (play mode, not queued to change). Clicking on the Looper (purple thingy up top) will start recording to that buffer from the JACK audio input. A right-click -> load will let you load a sample into that buffer.
During the loading process (in a non-realtime thread :) the buffer is automatically time-stretched to match the current playback speed to seamlessly loop. All buffers that are recorded using JACK are automatically quantized to the current playback speed, so it all stays in sync.
Up in the top you'll see the new "Global Scene" entrybox, typing a number there will trigger all the buffers to start playing the scene ID that you type in. Some work needs to be done there to make that more user freindly, but for now it provides access to scene changes in a semi-useable way.
Luppp Session 1: Dubstep-y drum N bass-ish track
Note the heavy synth is a PureData patch, the drums were loaded from samples, and the Synth is recorded from the XV-3080 using the JACK audio input. Global scenes are used to switch between the different parts of the song.
Here a screencast of the "Global Scene" feature, and some of the Lv2 features. Excuse the rubbish quality, I'm only getting used to exporting from OpenShot at the moment :)
That's all for now, till next time
-Harry
The past while has seen quite some work being done, on various parts that needed attention: the UI, some internal effects & support for instruments, and better LV2 support. Also there's a "scene" thing come into play...
UI wise there's a mechanism in place that will "Osc Blob" send the nessisary information from the Engine, and it plots the wave shape on screen.
For instruments & effects we can now load PureData patches, and communicate with them using the JACK MIDI port. There isn't a lot of "routing" available, its all hard coded CC values at the moment, but that's on a todo list somewhere...
The Lv2 side of things has seen some changes, like a system whereby the Engine dynamically updates the UI of which plugin is loaded where, as well as where it can find the binary files to instantiate the corresponding plugin UI.
Finally the "Scene" thing, basically its a way to organize a song or structure audio clips into groupings that can be played back simultaneously.
So here we have a blank session with 5 "tracks" or "loopers", each track complete with plugin slots, solo mute buttons, a pitch slider (left), and a volume slider (right) and 2D ambisonic panner.
In the scene selector we see each buffer is currently green (play mode, not queued to change). Clicking on the Looper (purple thingy up top) will start recording to that buffer from the JACK audio input. A right-click -> load will let you load a sample into that buffer.
During the loading process (in a non-realtime thread :) the buffer is automatically time-stretched to match the current playback speed to seamlessly loop. All buffers that are recorded using JACK are automatically quantized to the current playback speed, so it all stays in sync.
Up in the top you'll see the new "Global Scene" entrybox, typing a number there will trigger all the buffers to start playing the scene ID that you type in. Some work needs to be done there to make that more user freindly, but for now it provides access to scene changes in a semi-useable way.
Luppp Session 1: Dubstep-y drum N bass-ish track
Note the heavy synth is a PureData patch, the drums were loaded from samples, and the Synth is recorded from the XV-3080 using the JACK audio input. Global scenes are used to switch between the different parts of the song.
Here a screencast of the "Global Scene" feature, and some of the Lv2 features. Excuse the rubbish quality, I'm only getting used to exporting from OpenShot at the moment :)
-Harry
Subscribe to:
Posts (Atom)







