xi-lang 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +2 -2
- data/lib/xi/core_ext/numeric.rb +2 -2
- data/lib/xi/osc.rb +0 -1
- data/lib/xi/pattern/generators.rb +65 -12
- data/lib/xi/pattern/transforms.rb +10 -8
- data/lib/xi/scale.rb +21 -1
- data/lib/xi/stream.rb +14 -1
- data/lib/xi/supercollider/stream.rb +0 -4
- data/lib/xi/supercollider.rb +0 -1
- data/lib/xi/version.rb +1 -1
- data/xi.gemspec +1 -0
- metadata +16 -4
- data/lib/xi/osc/version.rb +0 -5
- data/lib/xi/supercollider/version.rb +0 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: da63fd14e08f6b37c4a915b77bc517b1e42d57979c336a09aebab8b2122ec798
         | 
| 4 | 
            +
              data.tar.gz: 33873883823d14e5356ef6580b5dd8e34eb983f78d7c35e7634ce91a8daf4d65
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 575c7d49a0b42294acc8c6d405354ca7060fae687375d00a0461f8b65d2d301a6515edb9cd022d86c8bc42003d6c64e677480ca4261229f96e56a1a485c092a1
         | 
| 7 | 
            +
              data.tar.gz: '08d14d4326fd8b901eb3bc5012c2c12b2a4074ca357630ab5c8aaf4cc2a1f69b86f0287ed6b528915c4890210c38d2be201c115ba14ccaab27b9e0d8dae311f2'
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -14,7 +14,7 @@ multiple known bugs, missing features, documentation and tests. | |
| 14 14 | 
             
            ## Example
         | 
| 15 15 |  | 
| 16 16 | 
             
            ```ruby
         | 
| 17 | 
            -
            melody = [ | 
| 17 | 
            +
            melody = [0,3,6,7,8]
         | 
| 18 18 | 
             
            scale = [Scale.iwato, Scale.jiao]
         | 
| 19 19 |  | 
| 20 20 | 
             
            fm.set degree: melody.p(1/2,1/8,1/8,1/8,1/16,1/8,1/8).seq(2),
         | 
| @@ -28,7 +28,7 @@ fm.set degree: melody.p(1/2,1/8,1/8,1/8,1/16,1/8,1/8).seq(2), | |
| 28 28 |  | 
| 29 29 | 
             
            kick.set freq: s("xi.x .ix. | xi.x xx.x", 70, 200), amp: 0.8, gate: :freq
         | 
| 30 30 |  | 
| 31 | 
            -
            clap.set n: s("..x. xyz. .x.. .xyx", 60, 61, 60).p. | 
| 31 | 
            +
            clap.set n: s("..x. xyz. .x.. .xyx", 60, 61, 60).p.slow(2),
         | 
| 32 32 | 
             
                     gate: :n,
         | 
| 33 33 | 
             
                     amp: 0.35,
         | 
| 34 34 | 
             
                     pan: P.sin(16, 2) * 0.6,
         | 
    
        data/lib/xi/core_ext/numeric.rb
    CHANGED
    
    | @@ -10,8 +10,8 @@ module Xi::CoreExt | |
| 10 10 |  | 
| 11 11 | 
             
                def degree_to_key(scale, steps_per_octave)
         | 
| 12 12 | 
             
                  accidental = (self - self.to_i) * 10.0
         | 
| 13 | 
            -
                  inner_key = scale[ | 
| 14 | 
            -
                  base_key = ( | 
| 13 | 
            +
                  inner_key = scale[self % scale.size]
         | 
| 14 | 
            +
                  base_key = (self / scale.size).to_i * steps_per_octave + inner_key
         | 
| 15 15 | 
             
                  if accidental != 0
         | 
| 16 16 | 
             
                    base_key + accidental * (steps_per_octave / 12.0)
         | 
| 17 17 | 
             
                  else
         | 
    
        data/lib/xi/osc.rb
    CHANGED
    
    
| @@ -124,13 +124,11 @@ module Xi | |
| 124 124 | 
             
                  # Generates values from a sinewave discretized to +quant+ events
         | 
| 125 125 | 
             
                  # for the duration of +delta+ cycles.
         | 
| 126 126 | 
             
                  #
         | 
| 127 | 
            -
                  # Values range from  | 
| 128 | 
            -
                  #
         | 
| 129 | 
            -
                  # @see #sin1 for the same function but constrained on 0 to 1 values
         | 
| 127 | 
            +
                  # Values range from 0 to 1
         | 
| 130 128 | 
             
                  #
         | 
| 131 129 | 
             
                  # @example
         | 
| 132 130 | 
             
                  #   peek P.sin(8).map { |i| i.round(2) }
         | 
| 133 | 
            -
                  #     #=> [0. | 
| 131 | 
            +
                  #     #=> [0.5, 0.85, 1.0, 0.85, 0.5, 0.15, 0.0, 0.15, 0.5, 0.85]
         | 
| 134 132 | 
             
                  #
         | 
| 135 133 | 
             
                  # @example +quant+ determines the size, +delta+ the total duration
         | 
| 136 134 | 
             
                  #   P.sin(8).size           #=> 8
         | 
| @@ -144,28 +142,83 @@ module Xi | |
| 144 142 | 
             
                  def sin(quant, delta=1)
         | 
| 145 143 | 
             
                    Pattern.new(size: quant, delta: delta / quant) do |y|
         | 
| 146 144 | 
             
                      quant.times do |i|
         | 
| 147 | 
            -
                        y << Math.sin(i / quant * 2 * Math::PI)
         | 
| 145 | 
            +
                        y << (Math.sin(i / quant * 2 * Math::PI) + 1) / 2
         | 
| 148 146 | 
             
                      end
         | 
| 149 147 | 
             
                    end
         | 
| 150 148 | 
             
                  end
         | 
| 151 149 |  | 
| 152 | 
            -
                  # Generates values from a  | 
| 153 | 
            -
                  # for the duration of +delta+ cycles | 
| 150 | 
            +
                  # Generates values from a sawtooth waveform, discretized to +quant+ events
         | 
| 151 | 
            +
                  # for the duration of +delta+ cycles
         | 
| 154 152 | 
             
                  #
         | 
| 155 153 | 
             
                  # Values range from 0 to 1
         | 
| 156 154 | 
             
                  #
         | 
| 157 | 
            -
                  # @ | 
| 155 | 
            +
                  # @example
         | 
| 156 | 
            +
                  #   peek P.saw(8)
         | 
| 157 | 
            +
                  #     #=> [(0/1), (1/8), (1/4), (3/8), (1/2), (5/8), (3/4), (7/8), (0/1), (1/8)]
         | 
| 158 | 
            +
                  #
         | 
| 159 | 
            +
                  # @example +quant+ determines the size, +delta+ the total duration
         | 
| 160 | 
            +
                  #   P.saw(8).size           #=> 8
         | 
| 161 | 
            +
                  #   P.saw(22).duration      #=> (1/1)
         | 
| 162 | 
            +
                  #   P.saw(19, 2).duration   #=> (2/1)
         | 
| 163 | 
            +
                  #
         | 
| 164 | 
            +
                  # @param quant [Integer]
         | 
| 165 | 
            +
                  # @param delta [Integer] (default: 1)
         | 
| 166 | 
            +
                  # @return [Pattern]
         | 
| 167 | 
            +
                  #
         | 
| 168 | 
            +
                  def saw(quant, delta=1)
         | 
| 169 | 
            +
                    Pattern.new(size: quant, delta: delta / quant) do |y|
         | 
| 170 | 
            +
                      quant.times do |i|
         | 
| 171 | 
            +
                        y << i / quant
         | 
| 172 | 
            +
                      end
         | 
| 173 | 
            +
                    end
         | 
| 174 | 
            +
                  end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                  # Generates an inverse sawtooth waveform, discretized to +quant+ events
         | 
| 177 | 
            +
                  # for the duration of +delta+ cycles
         | 
| 178 | 
            +
                  #
         | 
| 179 | 
            +
                  # Values range from 0 to 1
         | 
| 180 | 
            +
                  #
         | 
| 181 | 
            +
                  # @see P.saw
         | 
| 182 | 
            +
                  #
         | 
| 183 | 
            +
                  # @example
         | 
| 184 | 
            +
                  #   peek P.isaw(8)
         | 
| 185 | 
            +
                  #     #=> [(1/1), (7/8), (3/4), (5/8), (1/2), (3/8), (1/4), (1/8), (1/1), (7/8)]
         | 
| 186 | 
            +
                  #
         | 
| 187 | 
            +
                  # @param quant [Integer]
         | 
| 188 | 
            +
                  # @param delta [Integer] (default: 1)
         | 
| 189 | 
            +
                  # @return [Pattern]
         | 
| 190 | 
            +
                  #
         | 
| 191 | 
            +
                  def isaw(*args)
         | 
| 192 | 
            +
                    -P.saw(*args) + 1
         | 
| 193 | 
            +
                  end
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                  # Generates a triangle waveform, discretized to +quant+ events for the
         | 
| 196 | 
            +
                  # duration of +delta+ cycles
         | 
| 197 | 
            +
                  #
         | 
| 198 | 
            +
                  # Values range from 0 to 1
         | 
| 158 199 | 
             
                  #
         | 
| 159 200 | 
             
                  # @example
         | 
| 160 | 
            -
                  #   peek P. | 
| 161 | 
            -
                  #     #=> [0 | 
| 201 | 
            +
                  #   peek P.tri(8)
         | 
| 202 | 
            +
                  #     #=> [(0/1), (1/4), (1/2), (3/4), (1/1), (3/4), (1/2), (1/4), (0/1), (1/4)]
         | 
| 162 203 | 
             
                  #
         | 
| 163 204 | 
             
                  # @param quant [Integer]
         | 
| 164 205 | 
             
                  # @param delta [Integer] (default: 1)
         | 
| 165 206 | 
             
                  # @return [Pattern]
         | 
| 166 207 | 
             
                  #
         | 
| 167 | 
            -
                  def  | 
| 168 | 
            -
                     | 
| 208 | 
            +
                  def tri(quant, delta=1)
         | 
| 209 | 
            +
                    Pattern.new(size: quant, delta: delta / quant) do |y|
         | 
| 210 | 
            +
                      half_quant = quant / 2
         | 
| 211 | 
            +
                      up_half = half_quant.to_f.ceil
         | 
| 212 | 
            +
                      down_half = quant - up_half
         | 
| 213 | 
            +
             | 
| 214 | 
            +
                      up_half.times do |i|
         | 
| 215 | 
            +
                        y << i / half_quant
         | 
| 216 | 
            +
                      end
         | 
| 217 | 
            +
                      down_half.times do |i|
         | 
| 218 | 
            +
                        j = down_half - i
         | 
| 219 | 
            +
                        y << j / half_quant
         | 
| 220 | 
            +
                      end
         | 
| 221 | 
            +
                    end
         | 
| 169 222 | 
             
                  end
         | 
| 170 223 |  | 
| 171 224 | 
             
                  private
         | 
| @@ -219,6 +219,7 @@ module Xi | |
| 219 219 | 
             
                  def normalize(min, max)
         | 
| 220 220 | 
             
                    map { |v| v.respond_to?(:-) ? (v - min) / (max - min) : v }
         | 
| 221 221 | 
             
                  end
         | 
| 222 | 
            +
                  alias_method :norm, :normalize
         | 
| 222 223 |  | 
| 223 224 | 
             
                  # Scales a pattern of normalized values (0..1) to a custom range
         | 
| 224 225 | 
             
                  # +min+..+max+
         | 
| @@ -239,6 +240,7 @@ module Xi | |
| 239 240 | 
             
                  def denormalize(min, max)
         | 
| 240 241 | 
             
                    map { |v| v.respond_to?(:*) ? (max - min) * v + min : v }
         | 
| 241 242 | 
             
                  end
         | 
| 243 | 
            +
                  alias_method :denorm, :denormalize
         | 
| 242 244 |  | 
| 243 245 | 
             
                  # Scale from one range of values to another range of values
         | 
| 244 246 | 
             
                  #
         | 
| @@ -259,36 +261,36 @@ module Xi | |
| 259 261 | 
             
                  # Slows down a pattern by stretching start and duration of events
         | 
| 260 262 | 
             
                  # +num+ times.
         | 
| 261 263 | 
             
                  #
         | 
| 262 | 
            -
                  # It is the inverse operation of # | 
| 264 | 
            +
                  # It is the inverse operation of #fast
         | 
| 263 265 | 
             
                  #
         | 
| 264 | 
            -
                  # @see # | 
| 266 | 
            +
                  # @see #fast
         | 
| 265 267 | 
             
                  #
         | 
| 266 268 | 
             
                  # @example
         | 
| 267 | 
            -
                  #   peek_events %w(a b c d).p([1/4, 1/8, 1/6]). | 
| 269 | 
            +
                  #   peek_events %w(a b c d).p([1/4, 1/8, 1/6]).slow(2)
         | 
| 268 270 | 
             
                  #     #=> [E["a",0,1/2], E["b",1/2,1/4], E["c",3/4,1/3], E["d",13/12,1/2]]
         | 
| 269 271 | 
             
                  #
         | 
| 270 272 | 
             
                  # @param num [Numeric]
         | 
| 271 273 | 
             
                  # @return [Pattern]
         | 
| 272 274 | 
             
                  #
         | 
| 273 | 
            -
                  def  | 
| 275 | 
            +
                  def slow(num)
         | 
| 274 276 | 
             
                    Pattern.new(self, delta: delta.p * num)
         | 
| 275 277 | 
             
                  end
         | 
| 276 278 |  | 
| 277 279 | 
             
                  # Advance a pattern by shrinking start and duration of events
         | 
| 278 280 | 
             
                  # +num+ times.
         | 
| 279 281 | 
             
                  #
         | 
| 280 | 
            -
                  # It is the inverse operation of # | 
| 282 | 
            +
                  # It is the inverse operation of #slow
         | 
| 281 283 | 
             
                  #
         | 
| 282 | 
            -
                  # @see # | 
| 284 | 
            +
                  # @see #slow
         | 
| 283 285 | 
             
                  #
         | 
| 284 286 | 
             
                  # @example
         | 
| 285 | 
            -
                  #   peek_events %w(a b c d).p([1/2, 1/4]). | 
| 287 | 
            +
                  #   peek_events %w(a b c d).p([1/2, 1/4]).fast(2)
         | 
| 286 288 | 
             
                  #     #=> [E["a",0,1/4], E["b",1/4,1/8], E["c",3/8,1/4], E["d",5/8,1/8]]
         | 
| 287 289 | 
             
                  #
         | 
| 288 290 | 
             
                  # @param num [Numeric]
         | 
| 289 291 | 
             
                  # @return [Pattern]
         | 
| 290 292 | 
             
                  #
         | 
| 291 | 
            -
                  def  | 
| 293 | 
            +
                  def fast(num)
         | 
| 292 294 | 
             
                    Pattern.new(self, delta: delta.p / num)
         | 
| 293 295 | 
             
                  end
         | 
| 294 296 |  | 
    
        data/lib/xi/scale.rb
    CHANGED
    
    | @@ -1,4 +1,8 @@ | |
| 1 | 
            +
            require 'forwardable'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            class Xi::Scale
         | 
| 4 | 
            +
              extend Forwardable
         | 
| 5 | 
            +
             | 
| 2 6 | 
             
              DEGREES = {
         | 
| 3 7 | 
             
                # TWELVE TONES PER OCTAVE
         | 
| 4 8 | 
             
                # 5 note scales
         | 
| @@ -91,7 +95,23 @@ class Xi::Scale | |
| 91 95 |  | 
| 92 96 | 
             
              class << self
         | 
| 93 97 | 
             
                DEGREES.each do |name, list|
         | 
| 94 | 
            -
                  define_method(name) { list }
         | 
| 98 | 
            +
                  define_method(name) { self.new(list) }
         | 
| 95 99 | 
             
                end
         | 
| 96 100 | 
             
              end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              attr_reader :notes
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              def initialize(notes)
         | 
| 105 | 
            +
                @notes = notes
         | 
| 106 | 
            +
              end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
              def_delegators :@notes, :size, :[], :to_a, :first
         | 
| 109 | 
            +
             | 
| 110 | 
            +
              def p(*delta, **metadata)
         | 
| 111 | 
            +
                [@notes].p(*delta, **metadata)
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
              #def size
         | 
| 115 | 
            +
                #@notes.size
         | 
| 116 | 
            +
              #end
         | 
| 97 117 | 
             
            end
         | 
    
        data/lib/xi/stream.rb
    CHANGED
    
    | @@ -33,8 +33,9 @@ module Xi | |
| 33 33 |  | 
| 34 34 | 
             
                def set(delta: nil, gate: nil, **source)
         | 
| 35 35 | 
             
                  @mutex.synchronize do
         | 
| 36 | 
            +
                    remove_parameters_from_prev_source(source)
         | 
| 36 37 | 
             
                    @source = source
         | 
| 37 | 
            -
                    @gate = gate  | 
| 38 | 
            +
                    @gate = gate || parameter_with_smallest_delta(source)
         | 
| 38 39 | 
             
                    @delta = delta if delta
         | 
| 39 40 | 
             
                    @reset = true unless @playing
         | 
| 40 41 | 
             
                    update_internal_structures
         | 
| @@ -279,9 +280,21 @@ module Xi | |
| 279 280 | 
             
                    n_value, _ = enum.peek
         | 
| 280 281 | 
             
                    update_state(p, n_value)
         | 
| 281 282 | 
             
                  end
         | 
| 283 | 
            +
                  transform_state
         | 
| 282 284 | 
             
                  @reset = false
         | 
| 283 285 | 
             
                end
         | 
| 284 286 |  | 
| 287 | 
            +
                def parameter_with_smallest_delta(source)
         | 
| 288 | 
            +
                  source.min_by { |param, enum|
         | 
| 289 | 
            +
                    delta = enum.p.delta
         | 
| 290 | 
            +
                    delta.is_a?(Array) ? delta.min : delta
         | 
| 291 | 
            +
                  }.first
         | 
| 292 | 
            +
                end
         | 
| 293 | 
            +
             | 
| 294 | 
            +
                def remove_parameters_from_prev_source(new_source)
         | 
| 295 | 
            +
                  (@source.keys - new_source.keys).each { |k| @state.delete(k) } unless @source.nil?
         | 
| 296 | 
            +
                end
         | 
| 297 | 
            +
             | 
| 285 298 | 
             
                def latency_sec
         | 
| 286 299 | 
             
                  0.05
         | 
| 287 300 | 
             
                end
         | 
    
        data/lib/xi/supercollider.rb
    CHANGED
    
    
    
        data/lib/xi/version.rb
    CHANGED
    
    
    
        data/xi.gemspec
    CHANGED
    
    | @@ -28,6 +28,7 @@ Gem::Specification.new do |spec| | |
| 28 28 | 
             
              spec.add_development_dependency "pry-byebug"
         | 
| 29 29 | 
             
              spec.add_development_dependency "guard"
         | 
| 30 30 | 
             
              spec.add_development_dependency "guard-minitest"
         | 
| 31 | 
            +
              spec.add_development_dependency "yard"
         | 
| 31 32 |  | 
| 32 33 | 
             
              spec.add_dependency 'pry'
         | 
| 33 34 | 
             
              spec.add_dependency 'osc-ruby'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: xi-lang
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Damián Silvani
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019- | 
| 11 | 
            +
            date: 2019-05-11 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -94,6 +94,20 @@ dependencies: | |
| 94 94 | 
             
                - - ">="
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 96 | 
             
                    version: '0'
         | 
| 97 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            +
              name: yard
         | 
| 99 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 | 
            +
                requirements:
         | 
| 101 | 
            +
                - - ">="
         | 
| 102 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            +
                    version: '0'
         | 
| 104 | 
            +
              type: :development
         | 
| 105 | 
            +
              prerelease: false
         | 
| 106 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 | 
            +
                requirements:
         | 
| 108 | 
            +
                - - ">="
         | 
| 109 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            +
                    version: '0'
         | 
| 97 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 112 | 
             
              name: pry
         | 
| 99 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -156,7 +170,6 @@ files: | |
| 156 170 | 
             
            - lib/xi/error_log.rb
         | 
| 157 171 | 
             
            - lib/xi/logger.rb
         | 
| 158 172 | 
             
            - lib/xi/osc.rb
         | 
| 159 | 
            -
            - lib/xi/osc/version.rb
         | 
| 160 173 | 
             
            - lib/xi/pattern.rb
         | 
| 161 174 | 
             
            - lib/xi/pattern/generators.rb
         | 
| 162 175 | 
             
            - lib/xi/pattern/transforms.rb
         | 
| @@ -166,7 +179,6 @@ files: | |
| 166 179 | 
             
            - lib/xi/stream.rb
         | 
| 167 180 | 
             
            - lib/xi/supercollider.rb
         | 
| 168 181 | 
             
            - lib/xi/supercollider/stream.rb
         | 
| 169 | 
            -
            - lib/xi/supercollider/version.rb
         | 
| 170 182 | 
             
            - lib/xi/tidal_clock.rb
         | 
| 171 183 | 
             
            - lib/xi/version.rb
         | 
| 172 184 | 
             
            - synthdefs/other.scd
         | 
    
        data/lib/xi/osc/version.rb
    DELETED