Question

Dans mon projet, je veux être en mesure d'au moins informer l'utilisateur quelle chaîne la note dont ils ont besoin pour jouer est. Je peux obtenir la note et son octave, mais comme je l'ai découvert, cette note et son octave peut apparaître à plusieurs endroits sur une carte de guitare touchette.

Alors ma question est: Y at-il de toute façon à la carte une note midi à une corde de guitare

Était-ce utile?

La solution

Le code ici qui prend la valeur de note MIDI et renvoie la position sur la manche de guitare le plus proche de la fin de l'instrument. zéro FRET est une chaîne ouverte.

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
}

Résultat:

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

Autres conseils

Oui, avec la logique simple, vous pouvez le faire. Je considère l'aide d'un HashMap de <Note, MidiNote> où Note est votre classe qui tient à la fois la note relative et octave et a égaux et méthodes hashcode décent et MidiNote est votre classe pour représenter une note Midi.

Pensez à MIDI comme la définition des touches de piano. Codes et les clés sont un à un. Ce qui est différent d'une guitare ou le violon, où le même ton peut être joué à plusieurs endroits.

Si vous voulez représenter la liberté plus que vous avez sur une guitare dans un format de données, vous devrez trouver ou inventer un format différent. MIDI n'encoder ce que vous voulez.

Cependant, il y a une façon indirecte, vous pouvez aller à ce sujet, et il a à voir avec le développement heuristiques à l'endroit où jouer une note donnée une fenêtre glissante de notes qui sont venus avant. Une note donnée peut être plus facile sur une corde ou d'une autre en fonction de ce que vous venez de jouer, et vous pouvez calculer que, étant donné un modèle de la main et où les doigts auront été. Sur cette base, vous pouvez convertir MIDI à la guitare d'une manière qui rend plus facile MIDI à jouer. Si vous avez un morceau de musique de guitare qui suit ces règles déjà, vous pouvez l'encoder en MIDI puis décoder ultérieurement.

Mais peut-être votre question est plus fondamentale. Oui, vous pouvez mapper une note MIDI à une guitare. La méthode naïve est de faire une cartographie de chaque note jouable à la guitare, et vous décidez entre des alternatives équivalentes en choisissant celui le plus proche de l'écrou. Ce serait un one-to-one facile cartographie mais ne serait pas nécessairement le plus facile à jouer.

Si vous voulez vraiment faire les choses, vous allez faire une analyse minutieuse de la musique pour décider de la position de la main optimale et où la position de la main doit changer, et alors vous associer des notes MIDI avec frets et des cordes à base de ce qui est plus facile à atteindre basée sur la position de la main. La solution optimale est probablement NP-complet ou pire, vous auriez probablement envie de développer une solution approximative basée sur des règles sur la fréquence et dans quelle mesure vous pouvez changer la position de la main.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top