/* * JFugue - API for Music Programming * Copyright (C) 2003-2008 David Koelle * * http://www.jfugue.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.jfugue; /** * Represents key signature changes. Key signatures are kept for the whole song, * independent of tracks. You may change the key signature during a song. The * Player will automatically adjust note values based on the current key * signature - for example, in an F Major key signature, B will be converted to * B-flat automatically, unless the B is noted as a natural B (i.e., "Bn") * * @author David Koelle * @version 3.0 */ public final class KeySignature implements JFugueElement { private byte keySig; private byte scale; /** * Creates a new key signature object, with the specified tempo value. * * @param keySig * the key signature for this object, -7 to +7 - see MIDI * specification for more details * @param scale * whether this is a major (0) or minor (1) key signature */ public KeySignature(byte keySig, byte scale) { setKeySig(keySig); setScale(scale); } /** * Sets the key signature, from -7 to +7, for this object. See the MIDI * specification for more details * * @param keySig * the key signature for this object */ public void setKeySig(byte keySig) { this.keySig = keySig; } /** * Sets the scale - 0 for major, 1 for minor. See the MIDI specification for * more details * * @param scale * the scale for this object */ public void setScale(byte scale) { this.scale = scale; } /** * Returns the key signature for this object. * * @return the key signature for this object */ public byte getKeySig() { return this.keySig; } /** * Returns the scale for this object. * * @return the scale for this object */ public byte getScale() { return this.scale; } /** * Returns the Music String representing this element and all of its * settings. For a key signature object, the Music String is <code>K</code> * <i>keysig</i>, where 'keysig' is a root note followed by 'maj' or 'min' * (i.e., Cbmaj for C-flat major) * * @return the Music String for this element */ @Override public String getMusicString() { StringBuilder keySigSB = new StringBuilder(); keySigSB.append("K"); if (scale == 0) { keySigSB.append(majorSigs[getKeySig() + 7]); keySigSB.append("maj"); } else { keySigSB.append(minorSigs[getKeySig() + 7]); keySigSB.append("min"); } return keySigSB.toString(); } /** * Returns verification string in this format: KeySig: keySig={#}, scale={#} * * @version 4.0 */ @Override public String getVerifyString() { StringBuffer buffy = new StringBuffer(); buffy.append("KeySig: keySig="); buffy.append(getKeySig()); buffy.append(", scale="); buffy.append(getScale()); return buffy.toString(); } private static final String[] majorSigs = new String[] { "Cb", "Gb", "Db", "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#" }; private static final String[] minorSigs = new String[] { "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#", "G#", "D#", "A#" }; }