在Teoria.js中反转和弦的规范方法是什么?

时间:2015-11-27 11:27:52

标签: javascript music-notation

使用网络MIDI和Teoria.JS我正在尝试构建一个基于和弦控制器的网络。

我找到了一种方法,可以通过teoria-chord-progression为比例生成和弦,然后获取midi代码。现在我想得到同一和弦的反转的midi音符。

到目前为止我所做的是从原始midi音符中减去12作为第一个反演的第五个,然后是第三个和第五个进行第二次反演,但我确信有更好的方法。

编辑:这里是我的代码,它只播放未反转形式的和弦:

'use strict';

const teoria = require('teoria');
const chordProgression = require('teoria-chord-progression');
const Combokeys = require("combokeys");

const document = global.document;

const cSharpHMinor = teoria.scale('c#', 'harmonicminor');
const chords = chordProgression(cSharpHMinor, [1, 2, 3, 4, 5, 6, 7], 3).chords;
const combokeys = new Combokeys(document.documentElement);


global.navigator.requestMIDIAccess()
    .then((midiAccess) => {
        return Array.from(midiAccess.outputs.values());
    })
    .then((midiOutputs)=> {
        chords.forEach((chord, index) => {
            buildPadForChord(index + 1, chord, midiOutputs);
        });
    });


function createPad(index, chordName, listener) {
    let button = document.createElement('button');
    button.setAttribute('type', 'button');
    button.textContent = `${chordName} (${index})`;
    button.addEventListener('click', listener);

    let autorepeat = false;
    combokeys.bind(index.toString(), () => {
        if (!autorepeat) {
            autorepeat = true;
            listener();
        }
    }, 'keydown');
    combokeys.bind(index.toString(), () => {
        autorepeat = false;
    }, 'keyup');
    document.documentElement.appendChild(button);
}

function buildPadForChord(index, chord, midiOutputs) {

    let listener = () => {
        midiOutputs.forEach((midiOutput) => {
            chord.notes().forEach((note)=> {
                midiOutput.send([0x90, note.midi(), 127]);
                midiOutput.send([0x80, note.midi(), 127], global.performance.now() + 1000.0);
            });
        });
    };

    createPad(index, chord.name, listener);
}

0 个答案:

没有答案