音符的Java枚举

音符的Java枚举,java,enums,Java,Enums,如何在Java中创建音符枚举,每个音符都有一个八度,然后是一个键控变量?这就是我目前所拥有的 public enum Notes { c, cS, d, dS, e, f, fS, g, gS, a, aS,

如何在Java中创建音符枚举,每个音符都有一个八度,然后是一个键控变量?这就是我目前所拥有的

    public enum Notes
    {
            c,
            cS,
            d,
            dS,
            e,
            f,
            fS,
            g,
            gS,
            a,
            aS,
            b;
            int octave;
            boolean isPlaying;
    }
因此,当我访问代码中的枚举时,我会编写如下内容

Notes.c.octave = 4;
Notes.c.isPlaying = true;
现在我的问题是:我怎样才能为每个八度音阶中的每个音符设置一个显示布尔值

像这样:

Notes.c.octave.isPlaying = true;
或者我必须像这样去:

public enum Notes
{
        c1,
        cS1,
        d1,
        dS1,
        e1,
        f1,
        fS1,
        g1,
        gS1,
        a1,
        aS1,
        b1
        c2,
        cS2,
        d2,
        dS2,
        e2,
        f2,
        fS2,
        g2,
        gS2,
        a2,
        aS2,
        b2;

        etc...

        boolean isPlaying;
}

提前感谢您花时间回答此问题

我会移动到对象而不是枚举。您可以制作一个对象JavaNote,该对象具有: 弦乐; 整数倍频程; 布尔显示


为什么要麻烦使用枚举?

创建枚举元素,将默认的
倍频程
变量设置为
0
,将
变量设置为
false
,如下所示:

  public enum Notes
  {
        c(0, false),
        cS(0, false),
        d(0, false),
        dS(0, false),
        e(0, false),
        f(0, false),
        fS(0, false),
        g(0, false),
        gS(0, false),
        a(0, false),
        aS(0, false),
        b(0, false);
        int octave;
        boolean isPlaying;

        Notes(int octave, boolean isPlaying){
            this.octave = octave;
            this.isPlaying = isPlaying;
        }

        int getOctave(){
            return this.octave;
        }

        boolean isPlaying(){
            return this.isPlaying;
        }
   }
现在,您可以将枚举用作:

Notes.a.octave = 5;//assign the value if required
Notes.a.isPlaying = true;//assign the value if required
System.out.println(Notes.a.octave);//this will print 5
System.out.println(Notes.a.getOctave());//this will print 5
System.out.println(Notes.a.isPlaying);//this will print true
System.out.println(Notes.a.isPlaying());//this will print true

希望这有帮助

您不需要
isPlaying
标志,只需存储
Notes
实例的实例并检查它即可

Notes playingNote = Notes.c1;
当你必须检查播放的音符时

 playingNote == Notes.c1
您只需要更改构造函数。声明接受倍频程值的构造函数

c1(1);
private int octave = 0;
private Notes(int octave){
        this.octave= octave;
}

注:假设乐器的八度不变。虽然不是乐器方面的专家。对于同时使用多个音符,您可以使用EnumSet

这是一个很好的问题

我相信你的第一部分是正确的:

/** An enum of the valid note names */

public enum Note {
    c,
    cS,
    d,
    dS,
    e,
    f,
    fS,
    g,
    gS,
    a,
    aS,
    b;
}
您应该创建一个具有专用倍频程和isPlaying属性的类以及一个Notes枚举实例

也许您最终会得到这样的代码:

class InstrumentNote {
    private Note note;
    private int octave = 0;
    private boolean isPlyaing = false;

    public InstrumentNote(Note someNote, int someOctave) {
        note = someNote;
        octave = someOctave;
        isPlaying = false;
    }
}

class TestIt {
    public static void main(String[] args) {
        int octaveCount = 8; // big piano
        Set<Note> instrumentNotes = buildInstrument(octaveCount);
    }

    /** 
     *  Creates a Set of Notes.  A Set is used because each instrument
     *  should consist of a group of unique note instances, based on how
     *  many octaves it has.
     */

    public static Set<InstrumentNote> buildInstrument(int numOctaves) {
        Set<InstrumentNote> noteSet = new TreeSet<InstrumentNote>();
        for (int i = 0; i < numOctaves; i++) {
            for (Note n : Note.values()) {
               noteSet.add(new InstrumentNote(n, i, false));
            }
        }
        return noteSet;
    }


}
class注释{
私人票据;
专用整数倍频程=0;
私有布尔isplaying=false;
公共乐器音符(音符someNote,int someOctave){
note=someNote;
倍频程=某个倍频程;
isplay=false;
}
}
类测试{
公共静态void main(字符串[]args){
int octaveCount=8;//大钢琴
设置仪表注释=建筑仪表(八进制计数);
}
/** 
*创建一组音符。使用一组音符是因为每个乐器
*应包含一组独特的注释实例,具体取决于
*它有许多八度音阶。
*/
公共静态设置建筑仪表(int numOctaves){
Set noteSet=new TreeSet();
for(int i=0;i
八度音程是否应该成为枚举的一部分是一个很好的问题

音符的八度不应该改变。。。但是我认为它更适合作为一个类的私有成员,这个类也有一个Note实例

因为我不确定你的要求,我试着想象它们

我设想您可以从一组有效的音符(如上所示)中创建乐器或歌曲

这将为您提供各种灵活性:

  • 您可以创建一个包含一组注释的Abstract Instrument类
  • 你可以使用不同种类的乐器(小号一次只能演奏一个音符,钢琴可以演奏多个音符)
  • 您可以实现一首歌曲,这是一系列具有持续时间、音量、风格(断奏、连奏)等的音符

如果你想做上面的一些事情,你还需要一种对笔记排序的方法(这样就可以排序一组笔记)

您可以使用一个比较器和/或一个名为index或order(或其他)的枚举属性来实现这一点

我将把写a的练习留给你

我不确定你是否能让枚举实现接口


希望其中一些是准确的或有用的…

您不应该修改枚举的字段

原因是每个实例在JVM中都是唯一的(就像一个单例),而使用相同注释的另一个线程将共享相同的
playing
字段,这是一个严重错误的设计

此外,枚举应命名为单数
Note
,而不是复数
Notes
。原因应该很明显:枚举的每个实例代表一个注释,而不是多个注释


正确的方法是创建一个包含3个字段的类:

public class Tone {
    private Note note; 
    private int octave;
    private boolean playing;
    // with getters and setters
}

因为每个音符都可以是平的♭, 尖锐的♯, 双平面