Module: Niki

Defined in:
lib/niki.rb,
lib/niki/part.rb,
lib/niki/riff.rb,
lib/niki/song.rb,
lib/niki/chords.rb,
lib/niki/version.rb,
lib/niki/instrument.rb

Overview

Niki

Niki is a Ruby DSL to describe and play musical pieces.

Syntax

A Niki Song is represented this way:

song = Niki::Song.new do

  # +instrument+ lets you configure different instruments in different
  # MIDI channels.
  instrument :piano do
    channel 3
  end

  instrument :drums do
    channel 10

    # You can define macros for notes:
    note[:kick]  = c1 # Define a macro for the c1 note, name it :kick
    note[:snare] = d1 # And the snare will be d1
    note[:hh]    = e1 # And the hh will be e1
  end

  # You can define reusable riffs that you will be able to play with
  # different instruments:
  riff :simple_break do
    note g3, 8
    note f3, 8
    note e3, 8
    note d3, 8
  end

  # Define your song parts like this:
  part :intro do
    # Notes are defined like this:
    #   +instrument+ +note or [array of notes]+, +duration+, +options+
    #
    # +instrument+
    #   Instrument must be one of those you defined above.
    #
    # +note or [array of notes]+
    #   Has to be a musical note like c3 or f2 or a chord like a3MAJ. It
    #   can also be an array of notes. Examples of valid musical notes:
    #
    #   c2                  - a C in the 2nd octave
    #   f4                  - an F in the 4th octave
    #   +f4                 - an F sharp in the 4th octave
    #   -d3                 - a D flat in the 3rd octave
    #   f3MAJ               - a F major chord in the 3rd octave
    #   -d3MIN              - a D flat minor chord in the 3rd octave
    #   [c3, -e3, g3, -b3]  - a C min 7th chord in the 3rd octave
    #   :kick               - whatever note you defined in your instrument
    #   silence             - a silent note
    #
    # +duration+
    #   Duration can be expressed as a number representing a fraction.
    #   For example, a quarter note (4 of them fit in a single
    #   measure) is expressed with the number 4. An eighth note (8 of them
    #   fit in a single measure) is expressed with 8, and so on.
    #
    # +options+
    #   Options is an optional hash where you can specify the following
    #   per-note settings:
    #
    #   :velocity => (a number between 0 and 127)
    #   :base     => (a base note to add to some chord for example)
    #
    drums [:kick, :hh], 8
    drums :hh, 8
    drums :hh, 8

    piano f2MAJ, 4
    piano f2MAJ, 4
    piano f2MAJ, 4
    piano f2MAJ, 4
    piano a2MIN, 4, :base => f2
    piano silence, 4

    # Play the previously defined riff with the piano.
    riff :simple_break, :piano
  end

  # You can repeat any part!
  repeat :intro

  part :chorus do
    drums :from => :intro # Use the drums from the intro

    piano c2MAJ, 4
    piano c2MAJ, 4
    piano c2MAJ, 4
    piano c2MAJ, 4
    piano g2MAJ, 4
    piano silence, 4
    piano g2MAJ, 4
    piano g2MAJ, 8
    piano g2MAJ, 8
  end
end

# Play the song!!!
song.play

Defined Under Namespace

Modules: Chords Classes: Instrument, Part, Riff, Song

Constant Summary collapse

VERSION =
"0.2.2"