melmager
Erfahrenes Mitglied
Nu gut ich mache es nun so:
ist zwar immer noch nicht OOP conform aber so habe ich den wenigsten Aufwand
So wie ich das festgestellt habe werde ich das OOP Prinzip nie verinnerlichen ich denke zu sehr in Eigenschaften / Functionen :-(
Die Noten class ist zwar immer noch nicht nach OOP - aber sie kann nun als Eingabe/Ausgabe String und Midi
Midi als Ausgabe halt 2 Functionen weil eine Note immer 2 MIDI Events sind. und beim Erstellen aus Midi muss ich halt mit Sonderzeichen arbeiten die dann bei der LiedList ausgewertet werden muss
In LiedList werde ich dann auch die nötigen Pausenzeichen ermitteln und die NotenSchlüssel usw in der List verwalten
Die class Editor und class NotenBlatt bekommen dann die class Note zugeschoben um "Ihr Ding" damit zu machen
und die class Notenzeichen die fürs Zeichen zuständig ist bleibt auch so, da ich ja die Fuctionen ein Mal bei der EditorClasse brauche und beim NotenBlatt
wie weit ich da noch mit Interfaces arbeiten kann / muss ist mir noch nicht klar - schaun wer mal
Code:
public class NotenBlatt extends JPanel {
// der ist fürs Zeichen zuständig und holt sich die Daten aus der LiedList
}
public class LiedList {
private ArrayList<NoteData> lieddata = new ArrayList<NoteData>();
private int index;
private long lasttick = 0;
private String noart = "-XY-L---Q-------I---------------O";
private String avnote = "SCDEFGAH";
void midi2Note() {
// wenn Note On neue Note anlegen mit dauer 0
// wenn Note Off .. entsprechende Note rückwärtssuchen und dauer eintragen
// wenn dauer zu gross - split also noch eine Note anlegen mit haltebogen
}
void text2Note() {
// sting auswerten und in die Liste anfügen
}
void setIndex (int pos) {
index = pos;
}
NoteData getnextNote() { // hole die Note von aktueller Pos in der List ; pos++
index++;
return lieddata.get(index-1);
}
boolean hasmoreNotes() {
return (index < lieddata.size());
}
}
public class NoteData {
private String cnoten = "SCDEFGHA";
char art;
int octave, note; // octave 10 ist Sonderzeichen note 1 ist C usw
int zeile,slot; // grafische Pos relativ
long tick; // pos zeitlich
boolean is, extend, halten;
boolean string2note(String ntxtin) {
boolean syntax = ntxtin.matches("[0-8][SCDEFGHA][OIQLY]#?\\.?U?" );
// aus einem String die Note ermitteln
return syntax;
}
String note2string () {
String temp = Integer.toString(octave) + Character.toString(cnoten.charAt(note)) + Character.toString(art);
if (is) {
temp = temp + "#";
}
if (extend) {
temp = temp + ".";
}
if (halten) {
temp = temp + "U";
}
return temp;
}
void midiEvent2note( javax.sound.midi.MidiEvent midiev ) {
tick = midiev.getTick();
byte[] block = midiev.getMessage().getMessage();
int cmd = (int)(block[0] & 0x70);
if (block.length == 3 & cmd == 0x80) {
byte zwert = block[1];
octave = ((int) zwert / 12) - 1;
note = ((int) zwert % 12 ) + 1;
if (block[2] > 0) {
art = '+';
} else {
art = '-';
}
} else {
art = '?';
}
}
MidiEvent note2midiEventOn() {
ShortMessage msg = new ShortMessage();
try {
msg.setMessage(ShortMessage.NOTE_ON, 0, octave * 12 + note - 1, 64);
} catch (InvalidMidiDataException e) {
// fehlerbehandlung
}
MidiEvent erg = new MidiEvent(msg,tick);
return erg;
}
MidiEvent note2midiEventOff() {
ShortMessage msg = new ShortMessage();
try {
msg.setMessage(ShortMessage.NOTE_OFF, 0, octave * 12 + note - 1, 0);
} catch (InvalidMidiDataException e) {
// fehlerbehandlung
}
MidiEvent erg = new MidiEvent(msg,tick); // noch länge hinzu
return erg;
}
}
ist zwar immer noch nicht OOP conform aber so habe ich den wenigsten Aufwand
So wie ich das festgestellt habe werde ich das OOP Prinzip nie verinnerlichen ich denke zu sehr in Eigenschaften / Functionen :-(
Die Noten class ist zwar immer noch nicht nach OOP - aber sie kann nun als Eingabe/Ausgabe String und Midi
Midi als Ausgabe halt 2 Functionen weil eine Note immer 2 MIDI Events sind. und beim Erstellen aus Midi muss ich halt mit Sonderzeichen arbeiten die dann bei der LiedList ausgewertet werden muss
In LiedList werde ich dann auch die nötigen Pausenzeichen ermitteln und die NotenSchlüssel usw in der List verwalten
Die class Editor und class NotenBlatt bekommen dann die class Note zugeschoben um "Ihr Ding" damit zu machen
und die class Notenzeichen die fürs Zeichen zuständig ist bleibt auch so, da ich ja die Fuctionen ein Mal bei der EditorClasse brauche und beim NotenBlatt
wie weit ich da noch mit Interfaces arbeiten kann / muss ist mir noch nicht klar - schaun wer mal
Zuletzt bearbeitet: