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


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

вторник, 16 июля 2013 г.

Играем на фортепиано на Java: Шаг 2 - Играем гаммы в разных тональностях

В прошлый раз мы научились извлекать ноту До из джавы. А теперь хочется поиграть по всем белым нотам в тональности До мажор. При этом хочется, чтобы в коде отражалась информация впитанная мной из сети на тему гармонии... Кодить я буду на русском и немного отходя от java code conventions, потому будет немного странно... Но это только в начале - цель моя максимально передать Музкальный DSL в коде...

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

Комментариев нет:

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