Для начала разберемся с интервалами
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, сила); } }На этом пока все... Продолжение тут...
Комментариев нет:
Отправить комментарий