docs: function from_shorthand(shorthand_string, slash) {
  	if(typeof shorthand_string == 'array'){
  		var res = [];
  		for(var i = 0; i < shorthand_string.length; i++) {
  			res.push(from_shorthand(shorthand_string[i]));
  		};
  		return res;
  	}
  	if(__indexOf.call(["NC", "N.C."], shorthand_string) >= 0) {
  		return [];
  	}
  
  	shorthand_string = shorthand_string.replace('min', 'm');
  	shorthand_string = shorthand_string.replace('mi', 'm');
  	shorthand_string = shorthand_string.replace('-', 'm');
  
  	shorthand_string = shorthand_string.replace('maj', 'M');
  	shorthand_string = shorthand_string.replace('ma', 'M');
  
  	if(!notes.is_valid_note(shorthand_string[0])) {
  		throw "NoteFormatError: Unrecognised note '" + shorthand_string[0] + "' in chord '" + shorthand_string + "'";
  	}
  
  	name = shorthand_string[0];
  
  	for (_i = 0, _len = shorthand_string.slice(1, shorthand_string.length).length; _i < _len; _i++) {
  		n = shorthand_string.slice(1, shorthand_string.length)[_i];
  		if (n === '#') {
  			name += n;
  		} else if (n === 'b') {
  			name += n;
  		} else {
  			break;
  		}
  	}
  
  	slash_index = -1;
  	s = 0;
  	rest_of_string = shorthand_string.slice(name.length, shorthand_string.length);
  	for (_i = 0, _len = rest_of_string.length; _i < _len; _i++) {
  		n = rest_of_string[_i];
  		if (n === '/') {
  			slash_index = s;
  		} else if (n === '|') {
  			return from_shorthand(shorthand_string.slice(0, name.length + s), from_shorthand(shorthand_string.slice(name.length + s + 1, shorthand_string.length)));
  		}
  		s += 1;
  	}
  
  	if(slash_index != -1 && !(__indexOf.call(["m/M7", "6/9", "6/7"], rest_of_string) >= 0)) {
  		res = shorthand_string.slice(0, name.length + slash_index);
  		return from_shorthand(shorthand_string.slice(0, name.length + slash_index), shorthand_string.slice(name.length + slash_index + 1, shorthand_string.length))
  	}
  
  	shorthand_start = name.length;
  
  	short_chord = shorthand_string.slice(shorthand_start, shorthand_string.length);
  	if(chord_shorthand.hasOwnProperty(short_chord)) {
  		res = chord_shorthand[short_chord](name);
  		if(slash != null) {
  			if(typeof slash == 'string') {
  				if(notes.is_valid_note(slash)) {
  					res.unshift(slash);
  				} else {
  					throw "NoteFormatError: Unrecognised note '" + slash + "' in slash chord '" + shorthand_string + "'";
  				}
  			} else if(typeof slash == 'object') {
  				r = slash;
  				for (_i = 0, _len = res.length; _i < _len; _i++) {
  					n = res[_i];
  					if (n !== r[r.length-1]) {
  						r.push(n);
  					}
  				}
  				return r;
  			}
  		}
  		return res;
  	} else {
  		throw "FormatError: Unknown shorthand: " + shorthand_string;
  	}
  }