From 0f566741bb4244fa681481be296e3a3301efbbb2 Mon Sep 17 00:00:00 2001 From: Tyler Perkins Date: Wed, 29 Sep 2021 22:31:00 -0400 Subject: [PATCH] Add markov chain layout --- Makefile | 2 +- src/chain.c | 13 +++--- src/chain.h | 4 +- src/main.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 122 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 62632a0..9f3b928 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ CC = gcc FLAGS = -pipe CFLAGS = -Wall -CFLAGS += -Ofast +CFLAGS += -O2 #CFLAGS += -g #CFLAGS += -pg diff --git a/src/chain.c b/src/chain.c index b4233ae..4cafa1c 100644 --- a/src/chain.c +++ b/src/chain.c @@ -7,15 +7,18 @@ #include "chain.h" m_node* m_next(const m_node* rhs){ - uint16_t total = 0; - int i = 0; + int i = 1; - uint16_t v = rand() % (sizeof(uint16_t) * 8); + long v = rand() % UINT16_MAX - 1; + //printf("v : %li\n", v); - while(v > total){ + long total = rhs->_conns[i]._probability; + + while(v >= total){ + //printf("prob : %u\n", rhs->_conns[i]._probability); total += rhs->_conns[i]._probability; ++i; } - return rhs->_conns[i]._node; + return rhs->_conns[i - 1]._node; } diff --git a/src/chain.h b/src/chain.h index eb2f196..af1cc14 100644 --- a/src/chain.h +++ b/src/chain.h @@ -10,6 +10,7 @@ #include #include #include +#include enum chord { one = 0x01, @@ -24,8 +25,9 @@ enum chord { // probability out of the size of a short struct m_conn { uint16_t _probability; - struct m_conn* _node; + struct m_node* _node; }; +typedef struct m_conn m_conn; struct m_node { enum chord _chord; diff --git a/src/main.c b/src/main.c index 6d23371..dd1a03f 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ // #include +#include #include "chain.h" @@ -12,12 +13,120 @@ // sample version of how to progress m_node* init(){ - m_node* nodes = (m_node*)malloc(sizeof(m_node) * NOTE_COUNT); + printf("init...\n"); + m_node* nodes = (m_node*)malloc(7 * sizeof(m_node)); + m_node* curr; + //I chord + curr = nodes; + curr->_chord = one; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 2); + curr->_conns[0]._probability = (UINT16_MAX) / 2; + //printf("I prob : %u\n", curr->_conns[0]._probability); + curr->_conns[0]._node = nodes + 1; //ii + curr->_conns[1]._probability = (UINT16_MAX) / 2; + curr->_conns[1]._node = nodes + 5; //vi + //ii chord + curr++; + curr->_chord = two; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 2); + curr->_conns[0]._probability = ((UINT16_MAX) / 4) * 3; + curr->_conns[0]._node = nodes + 4; //V + curr->_conns[1]._probability = ((UINT16_MAX) / 4); + curr->_conns[1]._node = nodes + 6; //vii + //iii chord + curr++; + curr->_chord = three; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 1); + curr->_conns[0]._probability = UINT16_MAX; + curr->_conns[0]._node = nodes + 5; //vi + + //IV chord + curr++; + curr->_chord = four; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 2); + curr->_conns[0]._probability = ((UINT16_MAX) / 4) * 3; + curr->_conns[0]._node = nodes + 0; //I + curr->_conns[1]._probability = ((UINT16_MAX) / 4); + curr->_conns[1]._node = nodes + 5; //vi + + //V chord + curr++; + curr->_chord = five; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 3); + curr->_conns[0]._probability = ((UINT16_MAX) / 3) * 2; + curr->_conns[0]._node = nodes + 0; //I + curr->_conns[1]._probability = ((UINT16_MAX) / 6); + curr->_conns[1]._node = nodes + 3; //IV + curr->_conns[2]._probability = ((UINT16_MAX) / 6); + curr->_conns[2]._node = nodes + 5; //vi + + //vi chord + curr++; + curr->_chord = six; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 4); + curr->_conns[0]._probability = ((UINT16_MAX) / 10) * 3; + curr->_conns[0]._node = nodes + 0; //I + curr->_conns[1]._probability = ((UINT16_MAX) / 10); + curr->_conns[1]._node = nodes + 1; //ii + curr->_conns[2]._probability = ((UINT16_MAX) / 10) * 5; + curr->_conns[2]._node = nodes + 4; //V + curr->_conns[3]._probability = ((UINT16_MAX) / 10); + curr->_conns[3]._node = nodes + 6; //vii + + //vii + curr++; + curr->_chord = seven; + curr->_conns = (m_conn*)malloc(sizeof(m_conn) * 2); + curr->_conns[0]._probability = ((UINT16_MAX) / 3) * 2; + curr->_conns[0]._node = nodes + 0; //I + curr->_conns[1]._probability = ((UINT16_MAX) / 6); + curr->_conns[1]._node = nodes + 3; //IV + curr->_conns[2]._probability = ((UINT16_MAX) / 6); + curr->_conns[2]._node = nodes + 5; //vi + + return nodes; } int main(int argc, char** argv){ + m_node* mchain = init(); + m_node* current = mchain; + srand(time(NULL)); + + int i_count = 0; + unsigned long ccount = 0; + + while(i_count < 2){ + switch(current->_chord){ + case one: + printf("I "); + i_count++; + break; + case two: + printf("ii "); + break; + case three: + printf("iii "); + break; + case four: + printf("IV "); + break; + case five: + printf("V "); + break; + case six: + printf("vi "); + break; + case seven: + printf("vii "); + break; + } + current = m_next(current); + ccount++; + } + + printf("\nDone with %lu!\n", ccount); }