001/*
002 * Trident - A Multithreaded Server Alternative
003 * Copyright 2014 The TridentSDK Team
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *    http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package net.tridentsdk.base;
019
020import net.tridentsdk.util.TridentLogger;
021
022import javax.annotation.concurrent.Immutable;
023
024/**
025 * Immutable value representing the pitch of a note played
026 *
027 * @author The TridentSDK Team
028 * @since 0.3-alpha-DP
029 */
030@Immutable
031public final class Note {
032    private final short id;
033
034    public Note(int id) {
035        if (id > 24) {
036            TridentLogger.get().error(new IllegalArgumentException("Note is too high!"));
037        } else if (id < 0) {
038            TridentLogger.get().error(new IllegalArgumentException("Note is too low!"));
039        }
040
041        this.id = (short) id;
042    }
043
044    /**
045     * Returns a note one step sharper than this
046     */
047    public Note sharpen() {
048        if ((int) this.id + 1 > 24) {
049            TridentLogger.get().error(new IllegalArgumentException("Cannot sharpen this note, it is already the max"));
050        }
051        return new Note((int) this.id + 1);
052    }
053
054    /**
055     * Returns a note flatter than this
056     */
057    public Note flatten() {
058        if ((int) this.id - 1 < 0) {
059            TridentLogger.get().error(new IllegalArgumentException("Cannot flatten this note, it is already the min"));
060        }
061        return new Note((int) this.id - 1);
062    }
063
064    public short id() {
065        return id;
066    }
067}