::  Posts  ::  RSS  ::  ◂◂RSS  ::  Contact

Unlinking Stereo Channels II

January 10th, 2013
music, sound, experiment, vsl1818, math, tech  [html]
I have stereo channels I want to unlink. Simple linear interpolation turns out not to be the answer, so I need to determine the relationship between gain, pan, and the output levels experimentally. I set up my VSL1818 as:
  smartphone           AB 1818 VSL
+------------+        +-----------+
|  sine wave |        |           |
| generation >--------> in1       |
|     app    |        |      aux3 >-----+
+------------+  +-----> in2       |     |
                |     |      aux4 >--+  |
                |  +--> in3       |  |  |
                |  |  |           |  |  |
                |  |  +-----------+  |  |
                |  +-----------------+  |
                +-----------------------+
The phone generated a tone, which went into input 1 of the mixer. I connected outputs 3 and 4 of the vsl1818 back to inputs 2 and 3. In software I set the mixer to send input 1 to outputs 3 and 4. Then a program I wrote iterated through combinations of gain and pan while measuring the levels of input 2 and 3:
pan %, gain %, left, right
...
30, 60, 165, 143
30, 61, 166, 145
30, 62, 168, 146
30, 63, 170, 147
30, 64, 172, 150
30, 65, 174, 151
30, 66, 175, 153
30, 67, 177, 156
30, 68, 179, 157
...
(full data, 10000 rows)
This is frustrating because of two different sources of nonlinearity. The first is that gain and pan are combined in some way I don't yet understand. The second is that the chosen gain (out) and measured level (in) aren't linear either:

Still, I can look at equivalence classes, combinations of gain and pan that all keep one channel the same while varying the other. Each graph shows all the combinations of gain (red) and pan (blue) that keep one channel at the specified level.

One channel constant at 0 (raw)
One channel constant at 24 (raw)
One channel constant at 65 (raw)
One channel constant at 84 (raw)
One channel constant at 113 (raw)
One channel constant at 131 (raw)
One channel constant at 160 (raw)
One channel constant at 187 (raw)
One channel constant at 221 (raw)
One channel constant at 235 (raw)

My goal is two functions:

  def to_gain_pan(left, right):
     ...
     return gain, pan

  def to_left_right(gain, pan):
     ...
     return left, right
I think I now have the data I need to write these functions, but I'm still not sure what they are.

Comment via: google plus, facebook

Recent posts on blogs I like:

I’m Giving a Talk About Construction Costs Tomorrow

By popular demand, I’m giving the talk I gave 2 weeks ago at NYU, again. The database will be revised slightly to include more examples (like Ukraine, which I added between when I gave the talk and when I blogged about it), and I may switch around a few t…

via Pedestrian Observations December 2, 2019

Your room can be as bright as the outdoors

The effect was huge: I became dramatically more productive between 3:30pm and whenever I turned off the light. I estimate the lamp bought me between half an hour and two hours a day, depending on how overcast it was.

via benkuhn.net November 26, 2019

git-subtrac: all your git submodules in one place

Long ago, I wrote git-subtree to work around some of my annoyances with git submodules. I've learned a lot since then, and the development ecosystem has improved a lot (shell scripts are no longer the best way to manipulate git repos? Whoa!). Thus, I …

via apenwarr November 24, 2019

more     (via openring)

More Posts:


  ::  Posts  ::  RSS  ::  ◂◂RSS  ::  Contact