音符的Java枚举
如何在Java中创建音符枚举,每个音符都有一个八度,然后是一个键控变量?这就是我目前所拥有的音符的Java枚举,java,enums,Java,Enums,如何在Java中创建音符枚举,每个音符都有一个八度,然后是一个键控变量?这就是我目前所拥有的 public enum Notes { c, cS, d, dS, e, f, fS, g, gS, a, aS,
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
}
因为每个音符都可以是平的♭, 尖锐的♯, 双平面