Schönen Guten Abend

one more thing
-----------------

Wenn ich so im Manual lese "liest" es sich sehr danach an als wäre das gerät besonders gut dafür kurze loops aufzunehmen und abzuspielen.
Was würde passieren wenn man laaaaaange loops bzw ganze stücke einspielt?

Bitte entschuldigt meine anfängerfragen. bin leider was sequencer angeht unerfahren.
Das ist schon wichtig - denn es ist eine Stärke - du kannst auch sehr lange Takte spielen und anpassen - der MT lässt dir nie das Gefühl, dass was nicht geht wegen Länge.
Daher hast du dann einfach die Länge die du dann einstellst.
 
Unter Umständen für den Ein oder Anderen ganz interessant, ein kleines Programm in C, welches euklidische Rhythmen generiert. Vorbild war hier der euclidian Mode im Analog Rytm. Zwei euklidisch erzeugte Pattern, die jeweils geshifted mit boolischen Operatoren verglichen werden. Die finale Sequenz kann bei Bedarf ebenfalls rotieren.

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SEQSIZE 16 /*Pattern Length*/

char* init_Array(char* d, const char* s) {
    char* tmp = d;
    while (*s) {
        *d++ = *s++;
    }
    *d = '\0';
    return tmp;
}

char* append_Array(char* d, const char* s) {
    while (*d) {
        ++d;
    }
    while (*s) {
        *d++ = *s++;
    }
    *d = '\0';
    return d;
}

void euclid(int d[], const int size, const int value) {
    char** tmp = (char**)malloc(size * sizeof(char*));
    for (int i = 0; i < size; ++i) {
        tmp[i] = (char*)malloc((size + 1) * sizeof(char));
    }
    int z = size;
    int p = size;
    int t = size;
    int s = value;
    (p < s) ? (p = s, s = t) : 0;
    t = p - s;
    for (int i = 0; i < size; ++i) {
        (i < s) ? init_Array(tmp[i], "X") : init_Array(tmp[i], "-");
    }
    while (t > 1) {
        (z > 0) ? z-- : 0;
        if (t < s) {
            p = s;
            s = t;
        }
        else {
            p = t;
        }
        t = p - s;
        for (int i = 0; i < s; ++i) {
            append_Array(tmp[i], tmp[z - i]);
        }
        z = p;
    }
    int n = 0;
    for (int i = 0; i < z; ++i) {
        int j = 0;
        while (tmp[i][j] != '\0') {
            d[n++] = (tmp[i][j] == 'X') ? 1 : 0;
            ++j;
        }
    }
    for (int i = 0; i < size; ++i) {
        free(tmp[i]);
    }
    free(tmp);
}

void shift(int d[], const int size, int shift_Value) {
    if (!shift_Value) {
        return;
    }
    (shift_Value < 0) ? (shift_Value += size) : 0;
    int* tmp = (int*)malloc(size * sizeof(int));
    for (int i = 0; i < size; ++i) {
        tmp[(i + shift_Value) % size] = d[i];
    }
    for (int i = 0; i < size; ++i) {
        d[i] = tmp[i];
    }
    free(tmp);
}

void cmp(int d[], const int s[], const int size, const int bool_operator) {
    for (int i = 0; i < size; ++i) {
        switch (bool_operator) {
        case 0:
            d[i] &= s[i];
            d[i] = !d[i];
            break;
        case 1:
            d[i] &= s[i];
            break;
        case 2:
            d[i] |= s[i];
            break;
        case 3:
            d[i] ^= s[i];
            break;
        default:
            break;
        }
    }
}

void print_Seq(const int arr[], const int size) {
    for (int i = 0; i < size; ++i) {
        if (arr[i] == 1) {
            printf(" X ");
        }
        else {
            printf(" - ");
        }
    }
}

int main() {
    /*set random Values*/
    srand(time(NULL));
    int rnd_STEPS_A = rand() % (SEQSIZE - 1) + 1;
    int rnd_STEPS_B = rand() % (SEQSIZE - 1) + 1;
    int rnd_SHIFT_A = rand() % (2 * SEQSIZE - 2) - (SEQSIZE-1);
    int rnd_SHIFT_B = rand() % (2 * SEQSIZE - 2) - (SEQSIZE-1);
    int rnd_SHIFT_C = rand() % (2 * SEQSIZE - 2) - (SEQSIZE-1);
    int rnd_CMP_OPERATOR = rand() % 4;
  
    char op[4];
    if (rnd_CMP_OPERATOR == 0) init_Array(op,"NOT");
    else if (rnd_CMP_OPERATOR == 1) init_Array(op, "AND");
    else if (rnd_CMP_OPERATOR == 2) init_Array(op, "OR");
    else init_Array(op, "XOR");

    /*print Counter*/
    for (int i = 0; i < SEQSIZE; ++i) {
        printf("%02i|", i + 1);
    }
    printf(" | Counter\n");
    for (int i = 0; i < SEQSIZE; ++i) {
        printf("---");
    }
    printf("\n");

    /*init euclidian Sequence*/
    int a[SEQSIZE], b[SEQSIZE];
    euclid(a, SEQSIZE, rnd_STEPS_A);
    euclid(b, SEQSIZE, rnd_STEPS_B);

    /*print Seq_A*/
    print_Seq(a, SEQSIZE);
    printf(" | Seq_A -> %i von %i\n", rnd_STEPS_A, SEQSIZE);

    /*shift Seq_A*/
    shift(a, SEQSIZE, rnd_SHIFT_A);

    /*print shifted Seq_A*/
    print_Seq(a, SEQSIZE);
    printf(" | Seq_A shift -> %i\n", rnd_SHIFT_A);

    printf("\n");

    /*print Seq_B*/
    print_Seq(b, SEQSIZE);
    printf(" | Seq_B -> %i von %i\n", rnd_STEPS_B, SEQSIZE);

    /*shift Seq_B*/
    shift(b, SEQSIZE, rnd_SHIFT_B);

    /*print shifted Seq_B*/
    print_Seq(b, SEQSIZE);
    printf(" | Seq_B shift -> %i\n", rnd_SHIFT_B);
    printf("\n");

    /*print Seq_A / Seq_B*/
    print_Seq(a, SEQSIZE);
    printf(" | Seq_A\n");
    print_Seq(b, SEQSIZE);
    printf(" | Seq_B\n");

    /*compare Seq_A / Seq_B*/
    cmp(a, b, SEQSIZE, rnd_CMP_OPERATOR);

    /*print Result*/
    for (int i = 0; i < SEQSIZE; ++i) {
        printf("---");
    }
    printf("\n");

    print_Seq(a, SEQSIZE);
    printf(" | cmp Seq_A %s Seq_B\n\n",op);

    /*shift Result*/
    shift(a, SEQSIZE, rnd_SHIFT_C);

    /*print Pattern*/
    print_Seq(a, SEQSIZE);
    printf(" | Seq_C shift -> %i\n", rnd_SHIFT_C);
    for (int i = 0; i < SEQSIZE; ++i) {
        printf("===");
    }
    printf("\n");

    return 0;
}

Code:
01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16| | Counter
------------------------------------------------
 X  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  | Seq_A -> 1 von 16
 -  -  -  -  X  -  -  -  -  -  -  -  -  -  -  -  | Seq_A shift -> 4

 X  -  X  X  -  X  -  X  X  -  X  X  -  X  -  X  | Seq_B -> 10 von 16
 -  X  -  X  X  -  X  X  -  X  -  X  X  -  X  X  | Seq_B shift -> -12

 -  -  -  -  X  -  -  -  -  -  -  -  -  -  -  -  | Seq_A
 -  X  -  X  X  -  X  X  -  X  -  X  X  -  X  X  | Seq_B
------------------------------------------------
 -  X  -  X  -  -  X  X  -  X  -  X  X  -  X  X  | cmp Seq_A XOR Seq_B

 X  X  -  X  X  -  X  -  X  -  -  X  X  -  X  -  | Seq_C shift -> -11
================================================


** Process exited - Return Code: 0 **

Vorerst werden die euklidischen Rhythmen unter der Haube im Random Generator des MidiTraC's Anwendung finden, evtl. kommt auch noch ein UI für den User.

Kritik und Ideen im Hinblick auf Optimierung sind willkommen!
 
Zuletzt bearbeitet:


Neueste Beiträge

News

Zurück
Oben