#region License /* Copyright (c) 2006 Leslie Sanford * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #endregion #region Contact /* * Leslie Sanford * Email: jabberdabber@hotmail.com */ #endregion using System; using Sanford.Multimedia; namespace Sanford.Multimedia.Midi { /// /// Builds key signature MetaMessages. /// public class KeySignatureBuilder : IMessageBuilder { private Key key = Key.CMajor; private MetaMessage result = null; /// /// Initializes a new instance of the KeySignatureBuilder class. /// public KeySignatureBuilder() { } /// /// Initializes a new instance of the KeySignatureBuilder class with /// the specified key signature MetaMessage. /// /// /// The key signature MetaMessage to use for initializing the /// KeySignatureBuilder class. /// public KeySignatureBuilder(MetaMessage message) { Initialize(message); } /// /// Initializes the KeySignatureBuilder with the specified MetaMessage. /// /// /// The key signature MetaMessage to use for initializing the /// KeySignatureBuilder. /// public void Initialize(MetaMessage message) { #region Require if(message == null) { throw new ArgumentNullException("message"); } else if(message.MetaType != MetaType.KeySignature) { throw new ArgumentException("Wrong meta event type.", "messaege"); } #endregion sbyte b = (sbyte)message[0]; // If the key is major. if(message[1] == 0) { switch(b) { case -7: key = Key.CFlatMajor; break; case -6: key = Key.GFlatMajor; break; case -5: key = Key.DFlatMajor; break; case -4: key = Key.AFlatMajor; break; case -3: key = Key.EFlatMajor; break; case -2: key = Key.BFlatMajor; break; case -1: key = Key.FMajor; break; case 0: key = Key.CMajor; break; case 1: key = Key.GMajor; break; case 2: key = Key.DMajor; break; case 3: key = Key.AMajor; break; case 4: key = Key.EMajor; break; case 5: key = Key.BMajor; break; case 6: key = Key.FSharpMajor; break; case 7: key = Key.CSharpMajor; break; } } // Else the key is minor. else { switch(b) { case -7: key = Key.AFlatMinor; break; case -6: key = Key.EFlatMinor; break; case -5: key = Key.BFlatMinor; break; case -4: key = Key.FMinor; break; case -3: key = Key.CMinor; break; case -2: key = Key.GMinor; break; case -1: key = Key.DMinor; break; case 0: key = Key.AMinor; break; case 1: key = Key.EMinor; break; case 2: key = Key.BMinor; break; case 3: key = Key.FSharpMinor; break; case 4: key = Key.CSharpMinor; break; case 5: key = Key.GSharpMinor; break; case 6: key = Key.DSharpMinor; break; case 7: key = Key.ASharpMinor; break; } } } /// /// Gets or sets the key. /// public Key Key { get { return key; } set { key = value; } } /// /// The build key signature MetaMessage. /// public MetaMessage Result { get { return result; } } #region IMessageBuilder Members /// /// Builds the key signature MetaMessage. /// public void Build() { byte[] data = new byte[MetaMessage.KeySigLength]; unchecked { switch(Key) { case Key.CFlatMajor: data[0] = (byte)-7; data[1] = 0; break; case Key.GFlatMajor: data[0] = (byte)-6; data[1] = 0; break; case Key.DFlatMajor: data[0] = (byte)-5; data[1] = 0; break; case Key.AFlatMajor: data[0] = (byte)-4; data[1] = 0; break; case Key.EFlatMajor: data[0] = (byte)-3; data[1] = 0; break; case Key.BFlatMajor: data[0] = (byte)-2; data[1] = 0; break; case Key.FMajor: data[0] = (byte)-1; data[1] = 0; break; case Key.CMajor: data[0] = 0; data[1] = 0; break; case Key.GMajor: data[0] = 1; data[1] = 0; break; case Key.DMajor: data[0] = 2; data[1] = 0; break; case Key.AMajor: data[0] = 3; data[1] = 0; break; case Key.EMajor: data[0] = 4; data[1] = 0; break; case Key.BMajor: data[0] = 5; data[1] = 0; break; case Key.FSharpMajor: data[0] = 6; data[1] = 0; break; case Key.CSharpMajor: data[0] = 7; data[1] = 0; break; case Key.AFlatMinor: data[0] = (byte)-7; data[1] = 1; break; case Key.EFlatMinor: data[0] = (byte)-6; data[1] = 1; break; case Key.BFlatMinor: data[0] = (byte)-5; data[1] = 1; break; case Key.FMinor: data[0] = (byte)-4; data[1] = 1; break; case Key.CMinor: data[0] = (byte)-3; data[1] = 1; break; case Key.GMinor: data[0] = (byte)-2; data[1] = 1; break; case Key.DMinor: data[0] = (byte)-1; data[1] = 1; break; case Key.AMinor: data[0] = 1; data[1] = 0; break; case Key.EMinor: data[0] = 1; data[1] = 1; break; case Key.BMinor: data[0] = 2; data[1] = 1; break; case Key.FSharpMinor: data[0] = 3; data[1] = 1; break; case Key.CSharpMinor: data[0] = 4; data[1] = 1; break; case Key.GSharpMinor: data[0] = 5; data[1] = 1; break; case Key.DSharpMinor: data[0] = 6; data[1] = 1; break; case Key.ASharpMinor: data[0] = 7; data[1] = 1; break; } } result = new MetaMessage(MetaType.KeySignature, data); } #endregion } }