-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMidiReader.java
More file actions
138 lines (103 loc) · 4 KB
/
Copy pathMidiReader.java
File metadata and controls
138 lines (103 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import java.io.File;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Track;
public class MidiReader {
public static final int NOTE_ON = 0x90;
public static final int NOTE_OFF = 0x80;
public static void main(String[] args) throws Exception {
String filename;
Scanner scan = new Scanner(System.in);
PrintWriter writer = null;
Sequence sequence;
long timestamp = 0;
int frequency = 0;
int trackNumber = 0;
double timestampConverter = 1;
int tracks;
int pin[];
int length[];
System.out.println("Creating melody.h...");
if(new File("./arduino/MidiPlayer/melody.h").exists()){
System.out.print("melody.h already exists. Is it okay to overwrite it? (y/n) ");
if(!scan.nextLine().equals("y")){
System.out.println("Quitting...");
System.exit(1);
}
} else {
new File("./arduino/MidiPlayer/").mkdirs();
}
writer = new PrintWriter("./arduino/MidiPlayer/melody.h", "UTF-8");
System.out.println("Created melody.h");
while (true) { //loops until working filename is entered
System.out.print("Enter the name of the MIDI file: ");
filename = scan.nextLine();
try {
sequence = MidiSystem.getSequence(new File("./midi/" + filename)); //creating MIDI sequence
} catch (Exception exception) {
System.out.println("Error reading file " + filename + ": " + exception);
continue;
}
break;
}
timestampConverter = ((sequence.getMicrosecondLength() / 1000.0) / sequence.getTickLength()); //conversion rate for MIDI ticks to milliseconds
tracks = sequence.getTracks().length; //getting tracks
pin = new int[tracks]; //info arrays
length = new int[tracks];
writer.println("#include \"common.h\""); //writing out melody.h file
writer.println();
writer.println("#define TRACKS " + tracks);
writer.println();
for (Track track : sequence.getTracks()) { //looping through tracks (1 track to 1 buzzer)
trackNumber++;
timestamp = 0;
length[trackNumber - 1] = 0;
System.out.print("Which buzzer pin is track " + trackNumber + " on? "); //getting buzzer pin
pin[trackNumber - 1] = scan.nextInt();
writer.println("const uint32_t d" + trackNumber + "[] PROGMEM = {");
for (int i = 0; i < track.size(); i++) { //iterating through notes to get timestamps
MidiEvent event = track.get(i);
MidiMessage message = event.getMessage();
if (message instanceof ShortMessage) { //making sure message is valid message
timestamp = event.getTick();
writer.print(((long)(timestamp*timestampConverter)) + ","); //converting to milliseconds and writing to melody.h
length[trackNumber - 1]++;
}
}
writer.println();
writer.println("};");
writer.println();
writer.println("const uint16_t m" + trackNumber + "[] PROGMEM = {");
for (int i = 0; i < track.size(); i++) { //iterating through notes to get frequencies
MidiEvent event = track.get(i);
MidiMessage message = event.getMessage();
if (message instanceof ShortMessage) { //making sure message is valid message
ShortMessage sm = (ShortMessage) message;
if (sm.getCommand() == NOTE_OFF) { //whether event is the end of note...
frequency = 0;
} else if (sm.getCommand() == NOTE_ON) { //or start of note
frequency = (int) ((Math.pow(2.0, (sm.getData1() - 69.0) / 12.0)) * 440.0); // converts key # to frequency (in Hertz)
}
writer.print(frequency + ","); //writing to melody.h
}
}
writer.println();
writer.println("};");
writer.println();
writer.println();
}
writer.println("Track tracks[] = {"); //writing out array of Track structs
for(int i = 0; i<tracks; i++){
writer.println("{" + pin[i] + ", m" + (i+1) + ", d" + (i+1) + ", " + length[i] + "},");
}
writer.println("};");
scan.close();
writer.close();
System.out.println("Finished writing to melody.h!");
}
}