Для начала разберемся с интервалами
public enum Интервал {
ЧистаяПрима(0),
МалаяСекунда(0.5), Полутон(0.5),
БольшаяСекунда(1), Тон(1),
МалаяТерция(1.5),
БольшаяТерция(2),
ЧистаяКварта(2.5),
УвеличеннаяКварта(3), УменьшеннаяКвинта(3),
ЧистаяКвинта(3.5),
МалаяСекста(4),
БольшаяСекста(4.5),
МалаяСептима(5),
БольшаяСептима(5.5),
ЧистаяОктава(6);
private double интервал;
private Интервал(double интервал) {
this.интервал = интервал;
}
public double интервал() {
return интервал;
}
}
Теперь нам понадобятся тональности. Закодим для начала две самые белые мажорные (До и Ля) и пару разновидностей Ля Минора.
public enum Тональность {
ДоМажор(60, Тон, Тон, Полутон, Тон, Тон, Тон, Полутон),
ЛяМажор(57, Тон, Тон, Полутон, Тон, Тон, Тон, Полутон),
ЛяМинор(57, Тон, Полутон, Тон, Тон, Полутон, Тон, Тон),
ЛяМинорГармонический(57, Тон, Полутон, Тон, Тон, Полутон, МалаяТерция, Полутон),
ЛяМинорМелодический(57, Тон, Полутон, Тон, Тон, Тон, Тон, Полутон);
private int базоваяНота;
private Интервал[] интервалы;
private Тональность(int базоваяНота, Интервал... интервалы) {
this.базоваяНота = базоваяНота;
this.интервалы = интервалы;
}
public int get(int порядок) {
int интервал = 0;
for (int index = 0; index < порядок - 1; index++) {
интервал += интервалы[index].интервал()*2;
}
return базоваяНота + интервал;
}
}
А теперь поиграем гаммы в разных тональностях. Для этого я выделил в новый класс синтезатор из Main.
package com.apofig;
import javax.sound.midi.*;
public class Синтезатор {
private MidiChannel synthChannel;
public Синтезатор() {
try {
// init sequencer
Sequencer sequencer = null;
sequencer = MidiSystem.getSequencer();
sequencer.open();
// init synthesizer
Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
// get channel for synthesizing: the highest numbered channel. sets it up
MidiChannel[] channels = synth.getChannels();
synthChannel = channels[channels.length - 1];
synthChannel.programChange(0);
звучать(Тональность.ДоМажор.get(1), 10, 1);
} catch (MidiUnavailableException e) {
throw new RuntimeException(e);
}
}
public void звучать(int нота, int длительность, int сила) {
synthChannel.noteOn(нота, сила);
пауза(длительность);
synthChannel.noteOff(нота);
пауза(длительность);
}
public void звучатьГамму(Тональность тональность, int длительность, int сила) {
for (int index = 1; index <= 8; index++) {
звучать(тональность.get(index), длительность, сила);
}
}
private void пауза(int длительность) {
try {
Thread.sleep(длительность);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
А в Main осталось совсем немного
public class Main {
public static void main(String[] args) {
Синтезатор синтезатор = new Синтезатор();
final int delay = 300;
int сила = 120;
синтезатор.звучатьГамму(ДоМажор, delay, сила);
синтезатор.звучатьГамму(ЛяМажор, delay, сила);
синтезатор.звучатьГамму(ЛяМинор, delay, сила);
синтезатор.звучатьГамму(ЛяМинорГармонический, delay, сила);
синтезатор.звучатьГамму(ЛяМинорМелодический, delay, сила);
}
}
На этом пока все... Продолжение тут...

Комментариев нет:
Отправить комментарий