OVERVIEW:
Your topic is interesting, and in my opinion executed perfectly! It was easy to set everything up and get the program working. Your implementation is user-friendly, which implies that you have understood the topic well enough to streamline it for others. Documentation is in general clear and well structured, likewise the code appears mostly clean and the small comments you added help to clear out any confusion as to the use of certain functions. Overall, extremely impressive and a joy to review!
NOTES:
Documentation:
All of the necessary documentation is present, clear and concise. The only part which I feel could be improved on is the user-guide/Readme (which you yourself have already mentioned will be edited later). Once it is finalized, there should be nothing unclear for users. I would like to note that you have implemented the user-experience so well that even without any long explanation, I was able to get the code to run on the first go! Secondly, if you have the time, it would be interesting to mention a little more about Markov Chains in general in the Project Specifications!
Code:
Your code is clean, and there are no significant changes that I would suggest you make. Some that I thought to consider based on your documentation on time and space complexities is to reduce the amount of recursion, however I feel like such implementations for a project of this type is unnecessary. Secondly, storing all the functions in a single python-file did make the clarity of your code suffer slightly, but this was remedied by the comments you had for each function. It would not be too difficult to separate the 'Node'-class into its own separate file, and have the rest of the functions in a separate file, or to store the non-member functions into a 'Support'-class. However, none of this is necessary but rather just brainstorming on my end.
Testing:
The tests you ran are all justified and I have nothing to comment on those. If you were planning on running any more tests, some that you could consider are a sanity test (for example quite literally see that if you enter "C1, C1, C1" as the first notes, does the resulting midi-file start with three 'C1's, or if the user selects a specific instrument, that said instrument is used) and an end-to-end test to see that the code indeed returns a file at the end of the implementation (again just ways to increase the test coverage). These are just two suggestions I feel like could be easy to add to increase test coverage without too much extra work. Either way, the tests you have run are all well chosen and exactly what is to be expected!
Extra Notes:
This project was very fun to go through, and thank you for making it so easy for the user to get started! It is very impressive how you were able to use Markov Chains for this purpose (and with such concise code), and the end result is super.
Bonus points for a well executed UI with TkInter! :)
OVERVIEW:
Your topic is interesting, and in my opinion executed perfectly! It was easy to set everything up and get the program working. Your implementation is user-friendly, which implies that you have understood the topic well enough to streamline it for others. Documentation is in general clear and well structured, likewise the code appears mostly clean and the small comments you added help to clear out any confusion as to the use of certain functions. Overall, extremely impressive and a joy to review!
NOTES:
Documentation:
All of the necessary documentation is present, clear and concise. The only part which I feel could be improved on is the user-guide/Readme (which you yourself have already mentioned will be edited later). Once it is finalized, there should be nothing unclear for users. I would like to note that you have implemented the user-experience so well that even without any long explanation, I was able to get the code to run on the first go! Secondly, if you have the time, it would be interesting to mention a little more about Markov Chains in general in the Project Specifications!
Code:
Your code is clean, and there are no significant changes that I would suggest you make. Some that I thought to consider based on your documentation on time and space complexities is to reduce the amount of recursion, however I feel like such implementations for a project of this type is unnecessary. Secondly, storing all the functions in a single python-file did make the clarity of your code suffer slightly, but this was remedied by the comments you had for each function. It would not be too difficult to separate the 'Node'-class into its own separate file, and have the rest of the functions in a separate file, or to store the non-member functions into a 'Support'-class. However, none of this is necessary but rather just brainstorming on my end.
Testing:
The tests you ran are all justified and I have nothing to comment on those. If you were planning on running any more tests, some that you could consider are a sanity test (for example quite literally see that if you enter "C1, C1, C1" as the first notes, does the resulting midi-file start with three 'C1's, or if the user selects a specific instrument, that said instrument is used) and an end-to-end test to see that the code indeed returns a file at the end of the implementation (again just ways to increase the test coverage). These are just two suggestions I feel like could be easy to add to increase test coverage without too much extra work. Either way, the tests you have run are all well chosen and exactly what is to be expected!
Extra Notes:
This project was very fun to go through, and thank you for making it so easy for the user to get started! It is very impressive how you were able to use Markov Chains for this purpose (and with such concise code), and the end result is super.
Bonus points for a well executed UI with TkInter! :)