Menu
INTRODUCTION FOR PROGRAMMERS

This project showcases a number of Clojure best practices and leverages a number of powerful libraries to create a robust, extensible music notation system.
Key points:
1. Polymorphic Design: The extensive use of Clojure's multimethods, enhanced by the Methodical library, provides a flexible and extensible system that allows for polymorphic behavior across various musical elements while maintaining a clean, consistent API.
2. Immutable Data Structures: The project fully embraces Clojure's philosophy of immutability, using records for the core data structures and ensuring all operations return new instances rather than mutating existing ones.
3. Transactional System: Clojure's Software Transactional Memory (STM) with refs is used to create a powerful, thread-safe framework for accessing and mutating complex musical structures. Coming from other languages, you'll find the intelligent transaction system with automatic retries particularly impressive; this is one of the things Clojure gives us for free.
4. Separation of Concerns: The clear separation between musical models and visual models, as well as the use of mixins for shared behaviors, is designed to follow best architectural design practices.
5. Performance Optimization: The use of Specter for efficient updates of nested data structures gives high performance in handling large, complex scores.
6. Testing: The comprehensive test suite, making use of Midje, supports TDD methodologies. The high code coverage (98% overall) shows our strong commitment to reliability and correctness. This is especially important for the very tight backend core.
7. Concurrency Model: Underneath everything lies a high-performance concurrent update system. This is abstracted away into an intuitive and powerful API that the frontend consumes and which is also used internally in the backend. It doesn't matter if you bombard the API relentlessly from multiple threads; all transactions will eventually succeed without data corruption or collision, and entirely without locks. The system can do 100,000+ ACID-compliant transactional updates per second on a 6-core laptop from 2017.
8. API Design: The API namespace presents a clean, unified interface to the API consumer. As such, you simply deal with an intuitive, high-level and lightning-fast API and that's it. Call it from as many threads and as concurrently as you like. This makes development for the API consumer really easy. You use an intuitive polymorphic interface to add, change, move and remove things. Those things are instruments, staves, clefs, slurs, notes, articulation, dynamics, lyrics, pages, and so forth.
9. Plugins in any language: The plugin architecture allows for future expansion without modifying the core. This is a pivotal aspect of the system. Plugin developers can use any language supported by the Java Virtual Machine (JVM). This, in combination with the highly abstract API, makes creating FrankenScore plugins a breeze. It also means that manufacturers of commercial plugins can use their accustomed work flows.
FrankenScore makes a great effort to be a well-designed, thoroughly implemented and documented project that makes full use of Clojure's strengths according to best practices.
For all the technical and architectural details, see the Architectural Decision Log and the Documentation section in general.
Key points:
1. Polymorphic Design: The extensive use of Clojure's multimethods, enhanced by the Methodical library, provides a flexible and extensible system that allows for polymorphic behavior across various musical elements while maintaining a clean, consistent API.
2. Immutable Data Structures: The project fully embraces Clojure's philosophy of immutability, using records for the core data structures and ensuring all operations return new instances rather than mutating existing ones.
3. Transactional System: Clojure's Software Transactional Memory (STM) with refs is used to create a powerful, thread-safe framework for accessing and mutating complex musical structures. Coming from other languages, you'll find the intelligent transaction system with automatic retries particularly impressive; this is one of the things Clojure gives us for free.
4. Separation of Concerns: The clear separation between musical models and visual models, as well as the use of mixins for shared behaviors, is designed to follow best architectural design practices.
5. Performance Optimization: The use of Specter for efficient updates of nested data structures gives high performance in handling large, complex scores.
6. Testing: The comprehensive test suite, making use of Midje, supports TDD methodologies. The high code coverage (98% overall) shows our strong commitment to reliability and correctness. This is especially important for the very tight backend core.
7. Concurrency Model: Underneath everything lies a high-performance concurrent update system. This is abstracted away into an intuitive and powerful API that the frontend consumes and which is also used internally in the backend. It doesn't matter if you bombard the API relentlessly from multiple threads; all transactions will eventually succeed without data corruption or collision, and entirely without locks. The system can do 100,000+ ACID-compliant transactional updates per second on a 6-core laptop from 2017.
8. API Design: The API namespace presents a clean, unified interface to the API consumer. As such, you simply deal with an intuitive, high-level and lightning-fast API and that's it. Call it from as many threads and as concurrently as you like. This makes development for the API consumer really easy. You use an intuitive polymorphic interface to add, change, move and remove things. Those things are instruments, staves, clefs, slurs, notes, articulation, dynamics, lyrics, pages, and so forth.
9. Plugins in any language: The plugin architecture allows for future expansion without modifying the core. This is a pivotal aspect of the system. Plugin developers can use any language supported by the Java Virtual Machine (JVM). This, in combination with the highly abstract API, makes creating FrankenScore plugins a breeze. It also means that manufacturers of commercial plugins can use their accustomed work flows.
FrankenScore makes a great effort to be a well-designed, thoroughly implemented and documented project that makes full use of Clojure's strengths according to best practices.
For all the technical and architectural details, see the Architectural Decision Log and the Documentation section in general.
|
FrankenScore is a modern, open-source music notation software designed to handle complex musical scores with ease. It is designed to be a flexible and powerful music notation software tool providing professional, extremely high-quality results. The core functionality includes inputting music notation, formatting scores and their parts, and printing them. Additional features can be added as plugins, allowing for a modular and customizable user experience.
|