Не перестаю получать кайф от программирования midi синтезатора на своем компьюетере c с помощью java midi api. В прошлых постах раз я писал о том, что учу сольфеджио путем кодирования новых знаний в коде (тынц, пумц, бамц). А недавно я попал на видео 4 chords и решил закодить их. Родился новый класс, который я назвал Арпеджиатор. Сейчас там два паттерна по проще и один - как компиляция двух предыдущих.
public class FourChords {
public static void main(String[] args) {
Синтезатор синтезатор = new Синтезатор(new RealMidiChannelFactory());
Шаблон r = Арпеджиатор.get3(E5, H4, Cis5, A4);
// Шаблон r = Арпеджиатор.get3(G5, D5, E5, C5);
синтезатор.звучать(r.повтор(10));
}
}
Прикольно, что не все комбинации аккордов звучат (большинство режет слух). А вот описание шаблонов
public class Арпеджиатор {
public static Шаблон get(List<Нота> ноты) {
Нота n1 = ноты.get(0);
Нота n2 = ноты.get(1);
Нота n3 = ноты.get(2);
Звук звук1 = Доля.четверть(n2, n3);
Шаблон l1 = Шаблон.подряд(звук1, звук1, звук1, звук1);
Звук звук2 = Доля.четверть(n1);
Шаблон l2 = Шаблон.подряд(Пауза.восьмая(), звук2, звук2, звук2, звук2);
Шаблон l3 = l1.вместе(l2);
return l3.частьДо(1/l3.длинна());
}
public static Шаблон get2(Нота нота) {
Нота нота2 = нота.ниже(Интервал.ЧистаяОктава);
Звук звук1 = Доля.половина(нота, нота2);
return Шаблон.подряд(звук1, Пауза.четверть(), звук1.увеличить(0.5));
}
public static Шаблон get2_2(Нота нота) {
Нота нота2 = нота.ниже(Интервал.ЧистаяОктава);
Звук звук1 = Доля.восьмая(нота);
Шаблон s1 = Шаблон.подряд(звук1, звук1, Пауза.восьмая(), звук1, звук1, звук1);
Звук звук2 = Доля.восьмая(нота2).увеличить(3);
Звук звук3 = Доля.восьмая(нота2).увеличить(5);
Шаблон s2 = Шаблон.подряд(звук2, звук3);
return s1.вместе(s2);
}
public static Шаблон get3(Нота n1, Нота n2, Нота n3, Нота n4) {
Шаблон l1 = Арпеджиатор.get(Трезвучие.Мажорное.get(n1));
Шаблон l2 = Арпеджиатор.get(Трезвучие.Мажорное.get(n2));
Шаблон l3 = Арпеджиатор.get(Трезвучие.Минорное.get(n3));
Шаблон l4 = Арпеджиатор.get(Трезвучие.Мажорное.get(n4));
Шаблон s1 = l1.потом(l2, l3, l4);
Шаблон r1 = Арпеджиатор.get2(n1.ниже(Интервал.ЧистаяОктава));
Шаблон r2 = Арпеджиатор.get2(n2.ниже(Интервал.ЧистаяОктава));
Шаблон r3 = Арпеджиатор.get2(n3.ниже(Интервал.ЧистаяОктава));
Шаблон r4 = Арпеджиатор.get2(n4.ниже(Интервал.ЧистаяОктава));
Шаблон s2 = r1.потом(r2, r3, r4);
return s1.вместе(s2);
}
}
Как-то так. Вот исходники. Проект Maven.

сасаiте лалкi
ОтветитьУдалитьазаза
ОтветитьУдалить