Pregunta

En mi proyecto, quiero poder informar al menos al usuario en qué cadena debe jugar la nota. Puedo obtener la nota y su octava, pero como descubrí, esa nota y su octava pueden aparecer en múltiples lugares en una tabla de traste de guitarra.

Entonces, mi pregunta es: ¿hay de alguna manera mapear una nota midi a una cadena de guitarra?

¿Fue útil?

Solución

Aquí hay código que toma el valor de Midi Note y devuelve la posición en el diapasón de guitarra más cercana al final del instrumento. Fret Zero es una cadena abierta.

static class Fingering {
    int string;
    int fret;

    public String toString() {
        return "String : " + stringNames[string] + ", fret : " + fret;
    }
}

static String[] stringNames = new String[] {"Low E", "A", "D", "G", "B", "High E"}; 

    /** Array showing guitar string's relative pitches, in semi-tones, with "0" being low E */
static int[] strings = new int[]{64, 69, 74, 79, 83, 88};



public static Fingering getIdealFingering(int note) {
            if (note < strings[0])
                throw new RuntimeException("Note " + note + " is not playable on a guitar in standard tuning.");

    Fingering result = new Fingering();

    int idealString = 0;
    for (int x = 1; x < strings.length; x++) {
        if (note < strings[x])
            break;
        idealString = x; 
    }

    result.string = idealString;
    result.fret = note - strings[idealString];

    return result;
}

public static void main(String[] args) {
    System.out.println(getIdealFingering(64));  // Low E
    System.out.println(getIdealFingering(66));  // F#
    System.out.println(getIdealFingering(72));  // C on A string
    System.out.println(getIdealFingering(76));  // E on D string
    System.out.println(getIdealFingering(88));  // guitar's high e string, open
    System.out.println(getIdealFingering(100)); // high E, 12th fret
    System.out.println(getIdealFingering(103)); // high G
}

Resultado:

String : Low E, fret : 0
String : Low E, fret : 2
String : A, fret : 3
String : D, fret : 2
String : High E, fret : 0
String : High E, fret : 12
String : High E, fret : 15

Otros consejos

Sí, con una lógica simple puedes hacer esto. Consideraría usar un hashmap de <Note, MidiNote> Donde la nota es su clase que posee la nota relativa y la octava y tiene iguales y métodos de húsico decentes, y Midinote es su clase para representar una nota MIDI.

Piense en Midi como definir las teclas de piano. Los códigos y las claves son uno a uno. Esto es diferente a una guitarra o violín, donde se puede reproducir el mismo tono en varios lugares.

Si desea representar la mayor libertad que tiene en una guitarra en algún formato de datos, tendrá que encontrar o inventar un formato diferente. Midi no codificará lo que quieres.

Sin embargo, hay una forma indirecta de hacer esto, y tiene que ver con el desarrollo de heurísticas en cuanto a dónde jugar una nota dada una ventana deslizante de notas que vinieron antes. Una nota dada puede ser más fácil en una cadena u otra dependiendo de lo que acaba de jugar, y puede calcular que dado un modelo de la mano y dónde habrán estado los dedos. Según esto, puedes convertir MIDI en guitarra de una manera que haga que el Midi sea más fácil de tocar. Si ya tiene una pieza de música de guitarra que sigue estas reglas, puede codificarla en MIDI y luego decodificarla más tarde.

Pero quizás su pregunta sea más básica. Sí, puede asignar una nota midi a una guitarra. El método ingenuo es hacer una mapeo de cada nota jugable en la guitarra, y usted decide entre alternativas equivalentes eligiendo la más cercana a la nuez. Este sería un mapeo fácil de uno a uno, pero no necesariamente sería el más fácil de jugar.

Si realmente desea hacerlo bien, realizará un análisis cuidadoso de la música para decidir la posición óptima de la mano y dónde debe cambiar la posición de la mano, y luego asociará notas MIDI con trastes y cuerdas en función de lo que es más fácil para alcanzar basado en la posición de la mano. La solución óptima probablemente sea NP-Completa o peor, ¿probablemente quiera desarrollar una solución aproximada basada en algunas reglas sobre con qué frecuencia y qué tan lejos puede cambiar la posición de la mano?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top