My MOTU UltraLite journey

I recently purchased a motu ultralite hoping to use it to replace a behringer DCX I use as a crossover for my 4 way speakers. This post I hope will be helpful to others who want to use the motu.
The cliff notes so far is if you want to use a pi, it must be a 4. Mine is a 2GB version running 6.1.21-v8+ #1642 64 bit and not sure if
it mattered, but the motu was plugged into a USB3 slot. I'll try to answer any questions about the config if you are trying to get an ultralite to work on a pi-4.

The motu is significantly better than DCX from all reports. My plan was to use a pi-3 to drive the motu using Camilla as the brains for the crossover. The plan took a many twists and turns. Using the pi-3, recording would either go dead or freeze with a tone. Playback also would freeze with no tone although the meters on the motu would show a constant signal. Not good. I dug some, changing O/S version, tweaking ALSA, and numerous other dead ends I don't remember anymore. Next up, I tried it on my linux laptop. Competely dead. The laptop is running 4.15 kernel with ubuntu. Next up, I picked up a windows laptop to try that. That worked, but with caveats. Capture worked for 2 channels, so I did some captures of my SACD's and may use it to capture some vinyl. Output is a no go though I think. Windows shows the device as multiple devices with 2 channels each. I think for Camilla that will not work. I thought Camilla wants to see all channels as one device. Its sort of ok, as my ability to stomach windows may have ended up making it a no go anyway. After some 40 years of *nix O/S's, windows is just not me. Anyway, as it happens, I'd ordered a pi-4 back in November and Digi-key sent me a notice saying it was shipping. I'd kind of forgotten about it. So I took the SD card out if the pi-3, put it in the 4, booted and plugged in the motu. To my delight, it just worked. I'd already discovered the motu using usb audio class compliant that linux uses forces sampling rates/channel counts. 44.1/48 is 22 channels, 88.2/96 is 18 channels and 192 is 10 channels. I'd already planned on using the 96/18 channel mode which gives me access to the headphones, all 10 analog outs and 6 digital outs which I won't be using. As a test, I drove the motu with a digital sine wave and captured it using a scarlett box. After an hour, perfect sine wave still coming out of the motu. So I think whatever it did not like in the pi-3, the pi-4 hardware fixes the problem.

My next step is to get Camilla setup to what my current DCX settings are set to and start moving to the new setup. This means I first must decide balanced or SE from the output of the motu. The motu is balanced out and all my amps are single ended. My understanding is the motu provides the best performance in balanced out, and I do see a very slight degradation using REW and looping back the signal fully balanced verses only using the +/shield to drive the motu input. The difference is very slight though, THD+N is .0030 balanced versus .0032 SE. The difference is larger when only considering distortion, .00095 balanced versus .0011 SE. And low frequency noise from 20-100Hz is about 10db worse at 20Hz and trends to the same by 100Hz. So not sure there is any value in building a balanced to SE converter that may well be worse than just using the + only output of the motu

Well that is it for now. Just happy I got the box working. I was really close to giving up and selling it.
 
Mike,

interesting write up. I've also got a Behringer DCX & horns.

What software do you use as your player?

How are you getting on with single ended to your amps?

I've also got some other music sources which I'd like to use as below - do you think this would work?

Motu_Ultralite_RPI.jpg

Many thanks

Barry
 
Not quite done with the setup in my case. Still testing. My setup looks like it will be continue using preamp for analog in of tuner and phono. The output of the pre feeds the Mic in(well line in) chans 1/2. For filter software I am using Camilla. I have a camilla control file that pulls from the Line 1/2 ins. In your case I guess you could have different camilla control files to select from the various line ins. I have a attenuator post DAC's, although mine is fixed to 10/20/30/40db. Your case looks like fine grain control. As you probably know, much more important for the DCX than the motu as the DCX is noisier. And I guess you can skip the step where I use the motu master volume to control the volume of all line outs. As I mentioned before, I am going SE instead of building a diff/se converter. I just don't think I can do better than the se performance of the motu. I just measured the se offset voltage on a channel and it was only 30mv. I wanted to verify it wasn't something really high like 5V. And the player I am using is my own. I have done lots of stuff with Tcl/Tk so I created an audiowish that does what I want. It is very unique to my setup. Here is a pic of the main screen. The audiowish program launches camilla for each song or launches camilla to the line in mode. Stop and pause kill the camilla program and in the case of pause, remember the time offset so a restart can skip the right number of bytes when camilla is relaunched. One of the things I found by is camilla is probably the best I've seen in terms of keeping the buffer full and not dropping out due to buffer underruns. I set the chunksize to 16384 and have yet to see an underrun. If I use aplay, I get them fairly regularly on nfs mounted data. I also have a camilla control file to record and it too has yet to experience a write buffer issue. Kudo's to Henrik. Well done.

Curious, are you going to sell your DCX's? They seem to have gone up in value. I have 2 to drive my 4-ways.
audiowish.jpg
 
Thanks for your reply.
I can see that I need to do some more reading before pulling the trigger on a motu.
My experience with rpi to date is to very basic. How easy is it to make control files in Camilla?

Behringer DCX2496 was launched in May 2003 and as far as I can tell, production has not started again since the chip shortage. Websites in Europe are saying "Available in several months". Presumably this is driving up prices.
There is speculation or wishful thinking that Behringer will bring out an updated unit as opposed to restart production - no idea.
I bought my unit second hand @ £170 & it was 5 years old, so I'll probably keep hold of it.

Please keep the thread updated.
 
I'm using a 828 mk2 usb and after much messing about feeling out of my depth with the software options I managed to get a digital crossover up and running on a macbook pro which was a lot easier than Windows using kushviews( free )element as a plugin host using 1 plugin to do the crossover and one for eq element is a lot more intuitive to me than camilla dsp I just didn't understand it. crossover points can be altered in real time and eq as well obvs . the plugin I use are mbbandpass ( free ) and pro q3 (trial version )
 
The control files are pretty easy. Below is the header for a 96KHz file
Code:
devices:
  samplerate: 96000
  chunksize: 16384
  capture:
    type: File
    channels: 2
and for a 44.1KHz wave
Code:
devices:
  samplerate: 96000
  chunksize: 16384
  enable_resampling: true
  resampler_type: Synchronous
  capture_samplerate: 44100
  capture:
    type: File
    channels: 2
Then this follows
Code:
    filename: "/home/user/albums.cd/Adele/19/04"
    skip_bytes: 144
    format: S16LE
  playback:
    type: Alsa
    channels: 18
    format: S24LE3
    device:  hw:CARD=UltraLitemk5,DEV=0
And for 96, the format is S24LE3 instead of S16LE. What I do is use some Tcl to write the files.
Code:
proc make441Camilla { fName extraOffset } {
global postludeFile

    set f [open "Motu44Prelude.cfg" "r"]
    set fo [open "MotuIIR.cfg" "w"]
    while { [gets $f line] >= 0 } {
        puts $fo $line
    }
    close $f
    puts $fo "    filename: \"$fName\""
# extraOffset must be multiplied by sampling rate and bytes per sample for 2 channels of data
    set finalOffset [expr 144 + ($extraOffset * 44100 * 4)]
    puts $fo "    skip_bytes: $finalOffset"
    puts $fo "    format: S16LE"
    set f [open $postludeFile "r"]
    while { [gets $f line] >= 0 } {
        puts $fo $line
    }
    close $f
    close $fo
}

# Offset is always 512 bytes, but if paused or skipping to a song start embedded in the same file may need to go further
# extraOffset is in seconds
proc make96Camilla { fName extraOffset } {
global postludeFile

    set f [open "Motu96Prelude.cfg" "r"]
    set fo [open "MotuIIR.cfg" "w"]
    while { [gets $f line] >= 0 } {
        puts $fo $line
    }
    close $f
    puts $fo "    filename: \"$fName\""
# extraOffset must be multiplied by sampling rate and bytes per sample for 2 channels of data
    set finalOffset [expr 512 + ($extraOffset * 96000 * 6)]
    puts $fo "    skip_bytes: $finalOffset"
    puts $fo "    format: S24LE3"
    set f [open $postludeFile "r"]
    while { [gets $f line] >= 0 } {
        puts $fo $line
    }
    close $f
    close $fo
}
With the Tcl just copying the prelude file which contains the common beginning, then the part that writes the file I want it to play and how many bytes to skip before starting, then copying the common postlude file. This all gets written to a file called MotuIIR.cfg which is then passed to camilla as the control file. I may add some code to be able to easily A/B two different postludes with different filter settings. Camilla does not read wave per se, but will skip over the header bytes. If you are interested I can email you the c & Tcl/Tk code. It is nothing fancy and is very specific to the way I setup my files so maybe more confusing than helpful. Couple K lines altogether so I am reluctant to post that much stuff.
 
Funny, I guess after decades of C & Tcl, it reads like english to me now. Camilla is pretty straightforward though. Inside the examples in the distribution are config files that will get you a template, you just need to adjust the numbers for your filter requirements. Biquads(Butterworth, LR, etc) are really easy, FIR which is my eventual goal are a little more time consuming to set. The DCX I think is well done though, easy to adjust stuff on the fly and store off a new setup. I am probably going to sell mine. Probably right after behringer releases an updated version to tank the value of my used ones!
 
I've still not decided which cartridge I am going to use for recording my vinyl, I have gotten the simple Tcl/Tk code done to do the recording. I have attached it. You specify a directory to put the files in and the name of the file you want for that side of the album. Cue up the stylus and hit the record button. Song number will switch to 1. At the end of each song, click the mark button and a file with the suffix tim will be appended with the delta time from the last song. Easier than reading it off the liner notes and compensates for any time differential from the beginning. With all that, below is the Tcl code and the prelude/postlude files for Camilla. On the Motu, I set it up for 96K sampling. For 44K I think the channel count has to be 22 and for 192 I think it is 10.
proc makeRecCamilla { fName } { set f [open "recordPre.cfg" "r"] set fo [open "MotuRecord.cfg" "w"] while { [gets $f line] >= 0 } { puts $fo $line } close $f puts $fo " filename: \"$fName\"" puts $fo " format: S24LE3" set f [open recordPost.cfg "r"] while { [gets $f line] >= 0 } { puts $fo $line } close $f close $fo } proc rec {} { global startTime snum fname set d1 [.dir get] set f1 [.file get] if { $d1 == "" || $f1 == "" } { error "Directory and file must be specified" } set fname $d1/$f1 makeRecCamilla $fname.raw set startTime [clock seconds] set snum 1 .snum configure -text "Song $snum" .record configure -background red -activebackground red exec /home/pi/camilla/camilladsp MotuRecord.cfg & } proc mark {} { global startTime snum fname set curTime [clock seconds] set dtime [expr $curTime - $startTime] set mins [expr $dtime / 60] set secs [expr $dtime % 60] puts "[expr $curTime - $startTime] seconds $mins:$secs" exec echo "song $snum trackTime $mins:$secs" >> $fname.tim incr snum .snum configure -text "Song $snum" set startTime $curTime } proc stop {} { global startTime snum fname set curTime [clock seconds] set dtime [expr $curTime - $startTime] set mins [expr $dtime / 60] set secs [expr $dtime % 60] puts "[expr $curTime - $startTime] seconds $mins:$secs" exec echo "song $snum trackTime $mins:$secs" >> $fname.tim .snum configure -text "Song 0" .record configure -background #d9d9d9 -activebackground #ececec exec pkill camilladsp } frame .f1 frame .f2 frame .f3 frame .f4 button .record -text "Rec" -command rec button .mark -text mark -command mark button .stop -text stop -command stop label .dirL -text "Directory" label .fileL -text "File" label .snum -text "Song 0" entry .dir -width 30 .dir insert 0 /rabbitA/music/stage2 entry .file -width 30 # The default packing pack .f1 .f2 .f3 .f4 pack .record .stop -in .f1 -side left pack .dirL .dir -in .f2 -side left pack .fileL .file -in .f3 -side left pack .snum .mark -side left -in .f4
The recordPre.cfg file
devices: samplerate: 96000 chunksize: 16384 capture: type: Alsa channels: 16 format: S24LE3 device: hw:CARD=UltraLitemk5,DEV=0 playback: type: File channels: 2
And the recordPost.cfg file
mixers: to2chan: channels: in: 16 out: 2 mapping: - dest: 0 sources: - channel: 0 gain: 0 - dest: 1 sources: - channel: 1 gain: 0 pipeline: - type: Mixer name: to2chan