Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и регистрируйся!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

вторник, 21 января 2014 г.

Играем на фортепиано на Java: Шаг 4 - Арпеджиатор

Не перестаю получать кайф от программирования 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.

2 комментария: