Domanda

Nel mio progetto voglio essere in grado di informare almeno l'utente su quale stringa la nota che devono giocare. Posso ottenere la nota e la sua ottava, ma come ho scoperto, quella nota e la sua ottava possono apparire in più posti su una tavola da chitarra.

Quindi la mia domanda è: c'è comunque per mappare una nota MIDI a una corda di chitarra?

È stato utile?

Soluzione

Ecco il codice che prende il valore della nota MIDI e restituisce la posizione sulla tastiera di chitarra più vicina alla fine dello strumento. Fret Zero è una stringa aperta.

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
}

Risultato:

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

Altri suggerimenti

Sì, con una semplice logica puoi farlo. Considererei l'uso di un hashmap di <Note, MidiNote> Laddove la nota è la tua classe che contiene sia la nota relativa che l'ottava e ha un decente uguale e metodi di code hash e Midinote è la tua classe per rappresentare una nota MIDI.

Pensa a MIDI come definire le chiavi del piano. Codici e chiavi sono uno a uno. Questo è diverso da una chitarra o un violino, in cui lo stesso tono può essere suonato in più luoghi.

Se vuoi rappresentare la maggiore libertà che hai su una chitarra in un formato dati, dovrai trovare o inventare un formato diverso. MIDI non codificherà quello che vuoi.

Tuttavia, esiste un modo indiretto che potresti farlo, e ha a che fare con lo sviluppo dell'euristica su dove giocare una nota data una finestra scorrevole di note che sono state prima. Una determinata nota può essere più semplice su una stringa o sull'altra a seconda di ciò che hai appena giocato e puoi calcolare quell'insieme di un modello della mano e dove saranno state le dita. Sulla base di questo, puoi convertire MIDI in chitarra in un modo che rende il MIDI più facile da suonare. Se hai un pezzo di musica per chitarra che segue già queste regole, puoi codificarlo in MIDI e poi decodirla in seguito.

Ma forse la tua domanda è più semplice. Sì, puoi mappare una nota MIDI a una chitarra. Il metodo ingenuo è quello di fare una mappatura di ciascuna nota giocabile sulla chitarra e decidi tra alternative equivalenti scegliendo quello più vicino al dado. Questa sarebbe una mappatura one-to-one facile ma non sarebbe necessariamente la più facile da giocare.

Se vuoi davvero farlo bene, farai un'attenta analisi della musica per decidere la posizione ottimale della mano e dove la posizione della mano dovrebbe cambiare, e poi assoceresti le note MIDI a tasti e corde in base a ciò che è più semplice raggiungere in base alla posizione della mano. La soluzione ottimale è probabilmente NP-completa o peggio, probabilmente vorresti sviluppare una soluzione approssimativa in base ad alcune regole sulla frequenza e quanto lontano puoi cambiare la posizione delle mani.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top