• WANTED: Happy members who like to discuss audio and other topics related to our interest. Desire to learn and share knowledge of science required as is 20 years of participation in forums (not all true). Come here to have fun, be ready to be teased and not take online life too seriously. We now measure and review equipment for free! Click here for details.

Motu M4 - Tear down, bit of internals analysis and few in-house measurements

lizhuoyin

Active Member
Forum Donor
Joined
Dec 26, 2020
Messages
185
Likes
95
Location
NH
No, the screenshot is for single ended loopback only.

Monitor out #2 RCA single ended to TRS line-in #4 with -IN tied to ground. Full SE output signal which is around 2.5Vrms
My M4 loopback: Line out 3 to Line in 3, TRS balanced. 2.5Vrms.
 

Attachments

  • m4_01.JPG
    m4_01.JPG
    623 KB · Views: 124

lizhuoyin

Active Member
Forum Donor
Joined
Dec 26, 2020
Messages
185
Likes
95
Location
NH
Yes I expect cleaner, lower THD loopback with balanced connections. The noise level is almost the same though.
What puzzles me is that if I adjust the signal output to match the -12.4 dBFS, the THD+N is worse than yours. I was using a multimeter capable of measuring Vrms at 1KHz. I don't know how you measured your RCA output Vrms and if 2.5Vrms is accurate.
 

jlesterp

Member
Manufacturer
Forum Donor
Joined
Jan 16, 2021
Messages
78
Likes
81
Location
Philippines
My Uni-t multimeter doesn't have true RMS meter, so I'm setting the generator to 60hz-120hz to check for the output voltage.
Also I didn't calibrate REW software, I just measured the output using a multimeter.

Here's the loopback of Motu M4, connected with my Interface, there's distortion+noise penalty but that is expected. It can measure amplifiers with BTL output (up to 90Vrms).

The interface can protect Motu M4 from large DC. Also can limit the output signal going to Motu M4 via 6dB/10dB attenuators and a potentiometer

What puzzles me is that if I adjust the signal output to match the -12.4 dBFS, the THD+N is worse than yours. I was using a multimeter capable of measuring Vrms at 1KHz. I don't know how you measured your RCA output Vrms and if 2.5Vrms is accurate.
 

Attachments

  • JLE Interface.jpg
    JLE Interface.jpg
    289.6 KB · Views: 130
  • motum4+jle_interface_loopback.PNG
    motum4+jle_interface_loopback.PNG
    113.5 KB · Views: 127

Evgeniy

Member
Joined
Aug 10, 2018
Messages
95
Likes
40
Location
Ukraine, Odessa .
New revision of Motu M4 (maybe the new M2 too) use NXP USB controller, not Xmos, and currently only has Win10 / Mac drivers.
Unfortunately, support for Win7 (and Android, with driver from USB audio player / recorder?) still missing.

And DAC ESS9026pro instead of ESS9016s in prev. revision .
 

Attachments

  • Motu M4 board new_1.jpg
    Motu M4 board new_1.jpg
    593.6 KB · Views: 235
  • Motu M4 board new usb chip_2.jpg
    Motu M4 board new usb chip_2.jpg
    496.7 KB · Views: 196

hmm

New Member
Joined
Jun 8, 2021
Messages
1
Likes
0
Dear all, wanted to confirm that MOTU obviously now ships the new revision of the m4, as first made public by Evgeniy in the post above. have inspected a newly bought unit, seems the same as above.
win10 drivers (asio and mme/ks/dx) seem not to play so well on a ryzen mobile 4800u apu notebook, will have to do some many more tests. a rme fireface uc plays stable as a rock on the same notebook.
Evgeniy: did you encounter driver problems (=cracks and pops) with this new revision of the m4, if tested on win10?
Cheerio!
 
Last edited:

lizhuoyin

Active Member
Forum Donor
Joined
Dec 26, 2020
Messages
185
Likes
95
Location
NH
Dear all, wanted to confirm that MOTU obviously now ships the new revision of the m4, as first made public by Evgeniy in the post above. have inspected a newly bought unit, seems the same as above.
win10 drivers (asio and mme/ks/dx) seem not to play so well on a ryzen mobile 4800u apu notebook, will have to do some many more tests. a rme fireface uc plays stable as a rock on the same notebook.
Evgeniy: did you encounter driver problems (=cracks and pops) with this new revision of the m4, if tested on win10?
Cheerio!
The one I bought 2 months ago is the new revision. I have no issue with ryzen threadripper (old version) on the latest Win10 Pro desktop.
 
  • Like
Reactions: hmm

jlesterp

Member
Manufacturer
Forum Donor
Joined
Jan 16, 2021
Messages
78
Likes
81
Location
Philippines
Anyone who knows the value of U400, U402, IC400, IC401? TIA
Ok just opened my unit, IC400 and IC401 are THS4521, I'll try to upgrade it to THS4531. U400 and U402 has 45U marking on them.

Edit: just checked ak5554vn's datasheet and eval module, looks like THS4521 is enough.
 
Last edited:

jlesterp

Member
Manufacturer
Forum Donor
Joined
Jan 16, 2021
Messages
78
Likes
81
Location
Philippines
I changed 6 opamps from OPA1678 to OPA1656, my goal is to improve the sound output as I'm also using this as a DAC. Unmodified sound is somewhat thin.

I got improvements on THD performance for Single Ended Monitor out (2) to Line In (4), second pic attachment

From 0.00034% THD and 0.00075% THD+N
to 0.00019% THD and 0.00064% THD+N

Not that much lol.

Third attachment: balanced out (2) to bal line in (4)
0.00028% THD and 0.00045% I don't like the -110dB third harmonic
 

Attachments

  • IMG_3814.JPG
    IMG_3814.JPG
    536.2 KB · Views: 104
  • Motu M4 OPA1656.PNG
    Motu M4 OPA1656.PNG
    114.1 KB · Views: 104
  • Motu M4 Balanced out 2 in 4.PNG
    Motu M4 Balanced out 2 in 4.PNG
    104.7 KB · Views: 90
Last edited:

jlesterp

Member
Manufacturer
Forum Donor
Joined
Jan 16, 2021
Messages
78
Likes
81
Location
Philippines
The MOTU M4's DAC sounded 'hard' with all the OPA1656s so I've put back the OPA1678's in the DAC's IV stage and retained the OPA1656 in the buffer stage. Now it sounds better :)
 

137tmxth

Member
Joined
Jul 1, 2021
Messages
13
Likes
5
I guess software teardown belongs here as much as hardware?

I don't know if this is very interesting, but I noticed MSeriesLib.dll from MOTU's Windows driver package seems to provide more functionality than the included very basic control/status applet (MOTUMSeries.exe) exposes.

You can get more detailed statistics about the USB connection (the applet just shows a little warning icon if it thinks the buffer size is too small to work without glitches), and it seems you can also generate test signals.

Since this is a new account, I guess people would be a bit suspicious of any binaries I post? So here's just some C source code instead.

usbstats.c:
C:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

HMODULE MotuDLL;
FARPROC MSeriesInit;
FARPROC MSeriesGetNumDevices;
FARPROC MSeriesGetCurrentState;
FARPROC MSeriesGetDiagnostics;
FARPROC MSeriesFree;

int motulib_initialized = 0;
void InitMotuLib (void);
void DeInitMotuLib (void);

void Error (char *s, ...)
{
  va_list args;

  va_start(args,s);
  vprintf(s,args);
  va_end(args);

  fflush(stdout);
  exit(-1);
}

void InitMotuLib (void)
{
  int r;
  static int motulib_atexit_installed = 0;

  if (motulib_initialized)
    return;

  MotuDLL = LoadLibraryA("C:\\Program Files (x86)\\MOTU\\CoreUAC\\MSeriesLib.dll");
  if (!MotuDLL)
    Error("Error: Failed to LoadLibraryA MSeriesLib.dll!\n");

  MSeriesInit = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesFree = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesGetNumDevices = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesGetCurrentState = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesGetDiagnostics = GetProcAddress(MotuDLL, "[email protected]");
 
  if (!MSeriesInit || !MSeriesFree || !MSeriesGetNumDevices || !MSeriesGetDiagnostics || !MSeriesGetCurrentState)
    Error("Error: GetProcAddress failed for a required function from MSeriesLib.dll\n");
 
  r = MSeriesInit();
  if (r != 0)
    Error("Error: MSeriesInit call failed (return value %i)\n", r);

  // program will crash on exit if MSeriesLib isn't deinitialized first
  if (!motulib_atexit_installed)
  {
    atexit(DeInitMotuLib);
    motulib_atexit_installed = 1;
  }

  // must always wait a bit before calling any MSeriesLib functions after
  // library init, or program will crash!
  Sleep(100);
 
  motulib_initialized = 1;
}

void DeInitMotuLib (void)
{
  if (!motulib_initialized)
    return;
    
  MSeriesFree();
  Sleep(100);
    
  FreeLibrary(MotuDLL);

  motulib_initialized = 0;
}

int main (int argc, char **argv)
{
  int r, numdevices, devnum;
 
  int samplerate, buffersize, xso1x, waveinenables, waveoutenables;
 
  int MinUSBLat, MaxUSBLat, MinCBus, MaxCBus;
  int bufferStatusOk = 1;
  int latMax = 0;
 
  // fancy Win32 console crap
  HANDLE constdout,constdin;
  CONSOLE_SCREEN_BUFFER_INFO csbnfo;
  int conw,conh,startx,starty,visw,vish,conbufsz,x,y;
  CHAR_INFO *conbuf;
  COORD incoord,insize,zero;
  SMALL_RECT outcoord;
  INPUT_RECORD inrec;
  int conread;


  if (argc < 2)
    Error("Usage: usbstats <devnum>\n");
 
  InitMotuLib();
 
  MSeriesGetNumDevices(&numdevices);
  if (numdevices <= 0)
    Error("Error: MSeriesGetNumDevices returned <=0 devices\n");
 
  devnum = atoi(argv[1]);
 
  if (devnum < 1 || devnum > numdevices)
    Error("Error: Bad device number on command line (only %i device%s present)\n", numdevices, numdevices==1 ? "" : "s");
 
  devnum -= 1;
 
 
  // more fancy Win32 console crap
  constdin = GetStdHandle(STD_INPUT_HANDLE);
  constdout = GetStdHandle(STD_OUTPUT_HANDLE);
  if (constdin == NULL || constdout == NULL)
    Error("Error: Failed to get stdin/stdout console handles\n");

  if (!GetConsoleScreenBufferInfo(constdout, &csbnfo))
    Error("Error: GetConsoleScreenBufferInfo call failed\n");
    
  conw = csbnfo.dwSize.X;
  conh = csbnfo.dwSize.Y;
  startx = csbnfo.srWindow.Left;
  starty = csbnfo.srWindow.Right;
  visw = csbnfo.srWindow.Right-csbnfo.srWindow.Left+1;
  vish = csbnfo.srWindow.Bottom-csbnfo.srWindow.Top+1;
  conbufsz = visw*vish;

  conbuf = malloc(sizeof(CHAR_INFO)*conbufsz);
  if (!conbuf)
    Error("Error: Failed to allocate memory for character buffer\n");

  memset(conbuf,0,conbufsz*sizeof(CHAR_INFO));
 
  zero.X = zero.Y = 0;
 
  incoord.X = incoord.Y = 0;
  insize.X = visw; insize.Y = vish;
  outcoord.Left = outcoord.Top = 0;
  outcoord.Right = csbnfo.srWindow.Right;
  outcoord.Bottom = csbnfo.srWindow.Bottom;
 
  for (;;)
  {
    MSeriesGetCurrentState(devnum, &samplerate, &buffersize, &xso1x, &waveinenables, &waveoutenables);
    MSeriesGetDiagnostics(devnum, &MinUSBLat, &MaxUSBLat, &MinCBus, &MaxCBus);

    // formula straight from the C# UI applet
    //  latMax = Math.Max((oMaxUSBLat - 1) * 125, 125);
    latMax = (MaxUSBLat-1)*125;
    if (125 > latMax)
      latMax = 125;
    
    // formula straight from the C# UI applet
    //  bufferStatusOk = 1.2 * ((double) this.curBufferSize / (double) this.curSampleRate) > ((double) latMax + (double) oMaxCBus) / 1000000.0;
    bufferStatusOk = 1.2f * ((double)buffersize / (double)samplerate) > ((double)latMax + (double)MaxCBus) / 1000000.0f;

    SetConsoleCursorPosition(constdout, zero);
    WriteConsoleOutput(constdout, conbuf, insize, incoord, &outcoord);
    
    printf("press ESC to exit\n"\
           "\n"\
           "device=%i samplerate=%i buffersize=%i xso1x=%i wienables=%i woenables=%i\n"\
           "MinUSBLat=%i MaxUSBLat=%i MinCBus=%i MaxCBus=%i\n"\
           "\n"\
           "%s\n",
      devnum, samplerate, buffersize, xso1x, waveinenables, waveoutenables,
      MinUSBLat, MaxUSBLat, MinCBus, MaxCBus,
      bufferStatusOk ? "" : "/!\\ BUFFER SIZE WARNING /!\\");
    
    fflush(stdout);
    
    Sleep(50);
    
    PeekConsoleInput(constdin, &inrec, 1, &conread);
    if (conread)
    {
      if (inrec.EventType == KEY_EVENT)
      {
        if (inrec.Event.KeyEvent.bKeyDown == TRUE && inrec.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
          break;
      }
    }
    
    FlushConsoleInputBuffer(constdin);
  }
 
  free(conbuf);
  DeInitMotuLib();
    
  return 0;
}

thdtest.c
C:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

HMODULE MotuDLL;
FARPROC MSeriesInit;
FARPROC MSeriesGetNumDevices;
FARPROC MSeriesGetDeviceInfo;
FARPROC MSeriesSendTHD_TestSignalToOutputs;
FARPROC MSeriesFree;
FARPROC MSeriesStartAudio;
FARPROC MSeriesStopAudio;

int motulib_initialized = 0;
void InitMotuLib (void);
void DeInitMotuLib (void);

void Error (char *s, ...)
{
  va_list args;

  va_start(args,s);
  vprintf(s,args);
  va_end(args);

  fflush(stdout);
  exit(-1);
}

void InitMotuLib (void)
{
  int r;
  static int motulib_atexit_installed = 0;

  if (motulib_initialized)
    return;

  MotuDLL = LoadLibraryA("C:\\Program Files (x86)\\MOTU\\CoreUAC\\MSeriesLib.dll");
  if (!MotuDLL)
    Error("Error: Failed to LoadLibraryA MSeriesLib.dll!\n");

  MSeriesInit = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesFree = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesGetNumDevices = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesSendTHD_TestSignalToOutputs = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesStartAudio = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesStopAudio = GetProcAddress(MotuDLL, "[email protected]");
  MSeriesGetDeviceInfo = GetProcAddress(MotuDLL, "[email protected]6");
 
  if (!MSeriesInit || !MSeriesFree || !MSeriesGetNumDevices
      || !MSeriesSendTHD_TestSignalToOutputs
      || !MSeriesStartAudio || !MSeriesStopAudio
      || !MSeriesGetDeviceInfo)
    Error("Error: GetProcAddress failed for a required function from MSeriesLib.dll\n");
 
  r = MSeriesInit();
  if (r != 0)
    Error("Error: MSeriesInit call failed (return value %i)\n", r);

  // program will crash on exit if MSeriesLib isn't deinitialized first
  if (!motulib_atexit_installed)
  {
    atexit(DeInitMotuLib);
    motulib_atexit_installed = 1;
  }

  // must always wait a bit before calling any MSeriesLib functions after
  // library init, or program will crash!
  Sleep(100);
 
  motulib_initialized = 1;
}

void DeInitMotuLib (void)
{
  if (!motulib_initialized)
    return;
    
  MSeriesFree();
  Sleep(100);
    
  FreeLibrary(MotuDLL);

  motulib_initialized = 0;
}

int main (int argc, char **argv)
{
  int r, numdevices, devnum, outputs;
  char devver[32], devser[32], devname[32];

  int duration;
  double floatdur;
 
  if (argc < 3)
    Error("Usage: thdtest <devnum> <duration>\n");
 

  InitMotuLib();
 
  MSeriesGetNumDevices(&numdevices);
  if (numdevices <= 0)
    Error("Error: MSeriesGetNumDevices returned <=0 devices\n");
 
  devnum = atoi(argv[1]);
 
  if (devnum < 1 || devnum > numdevices)
    Error("Error: Bad device number on command line (only %i device%s present)\n", numdevices, numdevices==1 ? "" : "s");
 
  devnum -= 1;
 
  duration = atoi(argv[2]);
 
  if (duration < 1 || duration > 10)
    Error("Error: Bad duration parm on command line (should be 1 to 10)\n");
    
  r = MSeriesGetDeviceInfo(devnum, devver, devser, devname);
  if (r != 0)
    Error("Error: MSeriesGetDeviceInfo failed (code %i)\n", r);

  if (!strcmp(devname, "M4"))
    outputs = 4;
  else if (!strcmp(devname, "M2"))
    outputs = 2;
  else
    Error("Error: MSeriesGetDeviceInfo returned unknown device type \"%s\"\n", devname);


  MSeriesStartAudio(devnum);
  Sleep(100);
 
  floatdur = duration;
 
  MSeriesSendTHD_TestSignalToOutputs(devnum, floatdur);
  Sleep(duration*1000*outputs+100);
 
  MSeriesStopAudio(devnum);
  Sleep(100); 
 
  DeInitMotuLib();
    
  return 0;
}

Full list of exports from MSeriesLib.dll:
Code:
LIBRARY MSERIESLIB
EXPORTS
[email protected]@[email protected][email protected]
[email protected]@[email protected]@Z
[email protected]@[email protected][email protected]
[email protected]@[email protected][email protected]@@[email protected]@@@[email protected]@@[email protected]@@Z
[email protected]@[email protected][email protected]@@[email protected]@@@[email protected]@@[email protected]@@Z
[email protected]@[email protected]@@Z
[email protected]@[email protected]
[email protected]@[email protected]@@Z
[email protected]@[email protected]
[email protected]@[email protected]@Z
[email protected]@[email protected]@Z
[email protected]@[email protected]@Z
[email protected]@[email protected][email protected]
[email protected]@[email protected]@Z
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
??[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]@@Z
[email protected]@[email protected]@@Z
[email protected]@[email protected]@@Z
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@[email protected]
[email protected]@@[email protected]
[email protected][email protected]@[email protected]
[email protected]@@[email protected]
[email protected][email protected]@[email protected]
[email protected][email protected]@[email protected]
[email protected]@@QAENXZ
[email protected]@@QBENXZ
[email protected]@@[email protected]
[email protected]@@[email protected]@XZ
[email protected]@@QAENXZ
[email protected][email protected]@QBENXZ
[email protected]@@[email protected]
[email protected]@@[email protected]
[email protected]@@[email protected]
[email protected]@@[email protected]
[email protected][email protected]@[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
 
OP
trl

trl

Major Contributor
King of Mods
Joined
Feb 28, 2018
Messages
1,658
Likes
1,719
Location
Iasi, RO
I just realized that Line Out measures a bit better than Monitor Out, with about 1.5 dB SINAD.

MotuM4_LineOut_CosmosMono_4.5V_.png

M4 Line Out @ about 4.5V RMS - SINAD of 109.897 dB
(measured with Cosmos ADC in mono)​

MotuM4_MonitorOut_CosmosMono_4.5V_.png

M4 Monitor Out @ about 4.5V RMS - SINAD of 108.635 dB
(measured with Cosmos ADC in mono)​

Not much of a difference, for sure, but noise shaping is more visible on the Monitor Out, especially between 11 o'clock and 1 o 'clock (not shown in this post). I've seen a similar behaviour on Clarett 2Pre as well, where outputs 3/4 are having a more clean output than 1/2 outputs.
 
  • Like
Reactions: pma

Daverz

Major Contributor
Joined
Mar 17, 2019
Messages
1,068
Likes
1,078
My Motu M4, bought last june with firmware 2.00, seems to invert polarity on the balanced outputs. Has anyone else seen this issue?
 
OP
trl

trl

Major Contributor
King of Mods
Joined
Feb 28, 2018
Messages
1,658
Likes
1,719
Location
Iasi, RO
How did you verified this, please? Have you used a dual-spot scope or something else?
 
OP
trl

trl

Major Contributor
King of Mods
Joined
Feb 28, 2018
Messages
1,658
Likes
1,719
Location
Iasi, RO
I had applied a 100 Hz square signal on front Line Input (Right channel shown) and measured both Line Input and Line Output as well. Input signal was taken from my PicoScope and applied to Line Input.

MotuM4_square100Hz.png

Red is input generator, Blue is Motu M4 - Line Out (RCA)
Latency is quite low and signals doesn't look are inverted, but if anyone else has another idea on how to sync the two sinewaves and check for being or not inverted, please post back here. Thanks!
 
Joined
Nov 10, 2021
Messages
45
Likes
20
My Motu M4, bought last june with firmware 2.00, seems to invert polarity on the balanced outputs. Has anyone else seen this issue?

You're on firmware 2.0? Hmmm, I went to update and see no firmware listed.

I know the rca outs are opposite polarity of the balanced outs, idk which is correct polarity. I had to invert the subs I ran off the rca outs. Idk what the signal analysis says above but it's pretty obvious when your monitors are moving forward on a kick and the sub is moving backwards.
 
OP
trl

trl

Major Contributor
King of Mods
Joined
Feb 28, 2018
Messages
1,658
Likes
1,719
Location
Iasi, RO
M4 has no sub-out, so I'm not sure I understand how a monitor can have it's driver moving forward while the attached sub to move its driver backwards. Also, RCA is connected to V+ and GND, so there's nothing inverted there.

I'll wait for @Daverz to reply here on how he can perceive this inverted polarity, so I can check it myself on my M4 as well. Thanks!
 
Top Bottom