Class: Musicality::Function

Inherits:
Object
  • Object
show all
Defined in:
lib/musicality/notation/util/function.rb,
lib/musicality/notation/util/piecewise_function.rb

Direct Known Subclasses

Constant, Linear, Piecewise, Sigmoid

Defined Under Namespace

Classes: Constant, Linear, Piecewise, Sigmoid

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(domain = (DOMAIN_MIN...DOMAIN_MAX), memoize: true, &at_block) ⇒ Function

Returns a new instance of Function.

Raises:

  • (ArgumentError)


17
18
19
20
21
22
23
24
25
26
# File 'lib/musicality/notation/util/function.rb', line 17

def initialize domain = (DOMAIN_MIN...DOMAIN_MAX), memoize: true, &at_block
  raise ArgumentError unless domain.last > domain.first
  @domain = domain
  raise ArgumentError unless block_given?
  raise ArgumentError unless at_block.arity == 1
  @at_block = at_block

  @memoize = memoize
  @memoized = {}
end

Instance Attribute Details

#domainObject (readonly)

Returns the value of attribute domain.



16
17
18
# File 'lib/musicality/notation/util/function.rb', line 16

def domain
  @domain
end

Class Method Details

.transform_domains(start_domain, end_domain, x) ⇒ Object

x in start domain, transformed to x in end domain



11
12
13
14
# File 'lib/musicality/notation/util/function.rb', line 11

def self.transform_domains start_domain, end_domain, x
  perc = (x - start_domain.first) / (start_domain.last - start_domain.first).to_f
  return perc * (end_domain.last - end_domain.first) + end_domain.first
end

Instance Method Details

#==(other) ⇒ Object



41
42
43
# File 'lib/musicality/notation/util/function.rb', line 41

def ==(other)
  @domain == other.domain
end

#at(x) ⇒ Object

Raises:



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/musicality/notation/util/function.rb', line 28

def at(x)
  raise DomainError unless @domain.include?(x)
  if @memoize
    if @memoized.has_key? x
      @memoized[x]
    else
      @memoized[x] = @at_block.call(x)
    end
  else
    @at_block.call(x)
  end
end

#sample(xrange, srate) ⇒ Object



6
7
8
# File 'lib/musicality/notation/util/function.rb', line 6

def sample xrange, srate
  xrange.step(Rational(1,srate)).map { |x| at(x) }
end