Artifact
453623810cc2c439c093319c73f786b84628244210f809f2dfd54afb62c428b4:
var Note = require('./lib/note');
var Interval = require('./lib/interval');
var Chord = require('./lib/chord');
var Scale = require('./lib/scale');
var teoria;
// never thought I would write this, but: Legacy support
function intervalConstructor(from, to) {
  // Construct a Interval object from string representation
  if (typeof from === 'string')
    return Interval.toCoord(from);
  if (typeof to === 'string' && from instanceof Note)
    return Interval.from(from, Interval.toCoord(to));
  if (to instanceof Interval && from instanceof Note)
    return Interval.from(from, to);
  if (to instanceof Note && from instanceof Note)
    return Interval.between(from, to);
  throw new Error('Invalid parameters');
}
intervalConstructor.toCoord = Interval.toCoord;
intervalConstructor.from = Interval.from;
intervalConstructor.between = Interval.between;
intervalConstructor.invert = Interval.invert;
function noteConstructor(name, duration) {
  if (typeof name === 'string')
    return Note.fromString(name, duration);
  else
    return new Note(name, duration);
}
noteConstructor.fromString = Note.fromString;
noteConstructor.fromKey = Note.fromKey;
noteConstructor.fromFrequency = Note.fromFrequency;
noteConstructor.fromMIDI = Note.fromMIDI;
function chordConstructor(name, symbol) {
  if (typeof name === 'string') {
    var root, octave;
    root = name.match(/^([a-h])(x|#|bb|b?)/i);
    if (root && root[0]) {
      octave = typeof symbol === 'number' ? symbol.toString(10) : '4';
      return new Chord(Note.fromString(root[0].toLowerCase() + octave),
                            name.substr(root[0].length));
    }
  } else if (name instanceof Note)
    return new Chord(name, symbol);
  throw new Error('Invalid Chord. Couldn\'t find note name');
}
function scaleConstructor(tonic, scale) {
  tonic = (tonic instanceof Note) ? tonic : teoria.note(tonic);
  return new Scale(tonic, scale);
}
teoria = {
  note: noteConstructor,
  chord: chordConstructor,
  interval: intervalConstructor,
  scale: scaleConstructor,
  Note: Note,
  Chord: Chord,
  Scale: Scale,
  Interval: Interval
};
require('./lib/sugar')(teoria);
exports = module.exports = teoria;