-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparams.json
6 lines (6 loc) · 4.25 KB
/
params.json
1
2
3
4
5
6
{
"name": "RhythmTrainer",
"tagline": "An application to help you practice sight-reading rhythms",
"body": "# RhythmTrainer\r\n\r\n[![Build Status](https://travis-ci.org/cpe305/fall2016-project-dsabsay.svg?branch=master)](https://travis-ci.org/cpe305/fall2016-project-dsabsay)\r\n\r\nRhythmTrainer is an application that will help you practice sight-reading rhythms.\r\n\r\nMore documentation here: https://cpe305.github.io/fall2016-project-dsabsay/\r\n\r\n## Description\r\nRhythmTrainer presents rhythms in standard music notation. You can then record yourself performing the rhythms using the microphone in your computer. You can perform the rhythm by clapping, snapping, tapping a pencil on a desk, or doing anything else that produces distinct attacks. RhythmTrainer will then grade your performance and give you a score.\r\n\r\n![RhythmTrainer Screenshot](https://raw.githubusercontent.com/cpe305/fall2016-project-dsabsay/master/images/RhythmTrainer%20Screenshot.png)\r\n\r\n\r\n## Dependencies\r\n* JavaFX\r\n* Music notation is rendered with VexFlow (https://github.com/0xfe/vexflow) and VexTab (https://github.com/0xfe/vextab).\r\n* The open-source (AGPL-3.0) Essentia library is used for the audio analysis. More information about Essentia can be found here: http://essentia.upf.edu\r\n\r\n## Architecture\r\nRhythmTrainer has a layered architecture and (loosely) employs the model-view-controller design pattern.\r\n![Architecture Diagram](https://raw.githubusercontent.com/cpe305/fall2016-project-dsabsay/master/images/RhythmTrainer%20Architecture.png)\r\n\r\n\r\n## Design Patterns\r\n* **Singleton Pattern:** MainController\r\n * Only one instance of MainController for the entire application. Using the Singleton Pattern eliminates the need to pass around a reference to the MainController instance.\r\n ```\r\n public class MainController {\r\n private static MainController instance = null;\r\n ...\r\n public static MainController createInstance(Stage primaryStage,\r\n PerformanceRecordRepo recordRepo) {\r\n instance = new MainController(primaryStage, recordRepo);\r\n \r\n return instance;\r\n }\r\n\r\n public static MainController getInstance() throws ControllerException {\r\n if (instance == null) {\r\n throw new ControllerException(\"The MainController has not been instantiated.\");\r\n }\r\n \r\n return instance;\r\n }\r\n ...\r\n }\r\n ```\r\n* **Command Pattern:** Recorder\r\n * Recorder has an enclosed class RecordAudio that implements Runnable. This is used to capture audio in a separate thread.\r\n* **Factory Method Pattern:** PerformanceScore\r\n * PerformanceScore has an abstract method that creates a PerformanceRecord object.\r\n ```\r\n public abstract class PerformanceScore {\r\n ...\r\n public abstract PerformanceRecord createPerformanceRecord();\r\n ...\r\n }\r\n ```\r\n\r\n The subclasses of PerformanceScore implement this factory method.\r\n ```\r\n public PerformanceRecord createPerformanceRecord() {\r\n RhythmRecord record = new RhythmRecord(this.getExercise().getId(), this.getExercise().getType(),\r\n this.getExercise().getName(), this.getScore(), this.getScore(),\r\n new Date(), 0);\r\n \r\n return (PerformanceRecord) record;\r\n }\r\n ```\r\n* **Facade Pattern:** Exercise\r\n * The Exercise class only defines high-level information about the underlying exercise. This allows the application's controller to deal with various types of exercise objects in the same way.\r\n* **Strategy Pattern:** PerformanceGrader\r\n * The grading algorithms implement PerformanceGrader. A grading algorithm can be passed as an object to the PracticeController. This allows the PracticeController to use any grading algorithm without much modification.\r\n ```\r\n public interface PerformanceGrader {\r\n public PerformanceScore evaluatePerformance(...);\r\n }\r\n\r\n public abstract class RhythmGrader implements PerformanceGrader {\r\n ...\r\n }\r\n\r\n public class SimpleRhythmGrader extends RhythmGrader {\r\n public PerformanceScore evaluatePerformance(...);\r\n }\r\n ```",
"note": "Don't delete this file! It's used internally to help with page regeneration."
}