|
- #!/usr/bin/python2.5
- #
- # Copyright 2014 Olivier Gillet.
- #
- # Author: Olivier Gillet (ol.gillet@gmail.com)
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documentation files (the "Software"), to deal
- # in the Software without restriction, including without limitation the rights
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- # copies of the Software, and to permit persons to whom the Software is
- # furnished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in
- # all copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- # THE SOFTWARE.
- #
- # See http://creativecommons.org/licenses/MIT/ for more information.
- #
- # -----------------------------------------------------------------------------
- #
- # Lookup table definitions.
-
- import numpy
-
- lookup_tables = []
- lookup_tables_32 = []
-
- """----------------------------------------------------------------------------
- Easing
- ----------------------------------------------------------------------------"""
-
- def BounceEaseIn(t, b, c, d):
- return c - BounceEaseOut(d - t, 0, c, d) + b
-
-
- def BounceEaseOut(t, b, c, d):
- t /= d
- if t < 1 / 2.75:
- return c * (7.5625 * t * t) + b
- elif t < 2 / 2.75:
- t -= 1.5/2.75
- return c * (7.5625 * t * t + .75) + b
- elif t < 2.5 / 2.75:
- t -= 2.25 / 2.75
- return c * (7.5625 * t * t + .9375) + b;
- else:
- t -= 2.625 / 2.75
- return c * (7.5625 * t * t + .984375) + b;
-
-
- def BounceEaseInOut(t, b, c, d):
- if (t < d / 2):
- return BounceEaseIn(t * 2, 0, c, d) * 0.5 + b
- else:
- return BounceEaseOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b
-
-
- x = numpy.arange(0, 1025.0) / 1024.0
- steps = numpy.sign(x - 0.5) * 32767.5 + 32767.5
- linear = x * 65535.0
- quartic_in = (x ** 4) * 65535.0
- quartic_out = (1 - (1 - x) ** 4) * 65535.0
- in_out_sine = (1.0 - numpy.cos(x * numpy.pi)) / 2.0 * 65535.0
- in_out_bounce = x + 0
- for i in xrange(len(x)):
- in_out_bounce[i] = BounceEaseOut(x[i], 0, 65535.0, 1.0)
-
- # lookup_tables.append(('easing_steps', steps))
- # lookup_tables.append(('easing_linear', linear))
- lookup_tables.append(('easing_in_quartic', quartic_in))
- lookup_tables.append(('easing_out_quartic',quartic_out))
- lookup_tables.append(('easing_in_out_sine', in_out_sine))
- lookup_tables.append(('easing_in_out_bounce', in_out_bounce))
-
-
- """----------------------------------------------------------------------------
- 2164 variable-skew normalization
- ----------------------------------------------------------------------------"""
-
- x = numpy.arange(0, 256.0) / 255.0
- lookup_tables.append(('response_balance', numpy.round(32767 * (x ** 1.5))))
-
- gain = numpy.linspace(1.0 / 4096, 1.0, 1025)
- voltage = 65535 / 2.5 * -2.0 / 3.0 * numpy.log10(gain)
- vca_linear = numpy.maximum(numpy.minimum(numpy.round(voltage), 65535), 0)
- lookup_tables.append(('vca_linear', vca_linear))
-
-
-
- """----------------------------------------------------------------------------
- Simple expo table for LED brightness adjustment
- ----------------------------------------------------------------------------"""
-
- x = numpy.arange(0, 256.0) / 255.0
- expo = numpy.exp(-8.0 * (1.0 - x))
- lookup_tables.append(('exponential', 65535 * expo))
-
-
- """----------------------------------------------------------------------------
- Phase increment lookup table for LFO mode
- ----------------------------------------------------------------------------"""
-
- frequency = 110 * 2 ** (numpy.arange(0, 159.0) / 158.0 - 13)
- phase_increment = frequency / 24000 * (1 << 32)
- lookup_tables_32 = [('increments', numpy.round(phase_increment).astype(int))]
-
-
- """----------------------------------------------------------------------------
- Euclidean patterns
- ----------------------------------------------------------------------------"""
-
- def Flatten(l):
- if hasattr(l, 'pop'):
- for item in l:
- for j in Flatten(item):
- yield j
- else:
- yield l
-
-
- def EuclideanPattern(k, n):
- pattern = [[1]] * k + [[0]] * (n - k)
- while k:
- cut = min(k, len(pattern) - k)
- k, pattern = cut, [pattern[i] + pattern[k + i] for i in xrange(cut)] + \
- pattern[cut:k] + pattern[k + cut:]
- return pattern
-
-
- table = []
- for num_steps in xrange(1, 33):
- for num_notes in xrange(32):
- num_notes = min(num_notes, num_steps)
- bitmask = 0
- for i, bit in enumerate(Flatten(EuclideanPattern(num_notes, num_steps))):
- if bit:
- bitmask |= (1 << i)
- table.append(bitmask)
-
- lookup_tables_32 += [('euclidean', table)]
|