Skip to content

16BitNarwhal/ScoreSwipe

Repository files navigation

logo image

ScoreSwipe

Tests Code Size GitHub issues GitHub contributors GitHub last commit

Ever wanted to play a piece of music but you don't have enough hands to turn the page? Look no further! With ScoreSwipe, you can flip through the pages of your digital sheet music effortlessly by using your mind simply tilting your head.

Table of Contents

⭐ About

ScoreSwipe is a unique and innovative application that leverages computer vision technology to simplify the experience of reading sheet music. With ScoreSwipe, you can flip through the pages of your digital sheet music effortlessly by simply tilting your head.

🌱 Features

  1. Hands-Free Page Flipping: Tilt your head left to flip the page backward and right to flip the page forward.
  2. Digital Sheet Creation: Upload your own PDFs, photos from your gallery, or take and crop photos from within the app.
  3. Customizable Sensitivity: Adjust the sensitivity of head tilts to match your preferences.

πŸ“± Screenshots

Create & Navigate Score Edit & Delete Score
Screen_Recording_20240108_222434.mp4
Screen_Recording_20240108_222535.mp4

πŸ’» For Developers

The application is entirely built using Flutter, a cross-platform UI toolkit for building applications for mobile, web, and desktop from a single codebase. Flutter uses the Dart programming language.

πŸ› οΈ Setup

  1. Install Flutter
  2. Clone the repository
  3. Run flutter pub get to install dependencies
  4. Run flutter run to run the app
  5. Run flutter test to run the tests
  6. Run flutter build apk to build the apk

πŸ“ Project Structure

Important files and directories:

.
β”œβ”€β”€ assets # Static assets (eg. logo)
β”œβ”€β”€ fonts # Custom fonts
β”œβ”€β”€ lib # Source files. Contains all the logic for the app.
β”‚   β”œβ”€β”€ main.dart # Entry point for the app
β”‚   β”œβ”€β”€ common # Common files used throughout the app
β”‚   β”‚  β”œβ”€β”€ data # Deals with fetching and storing data
β”‚   β”‚  └── models # Data models
β”‚   β”œβ”€β”€ features # Contains the separate features of the app (UI and logic)
β”‚   β”‚  β”œβ”€β”€ score_browser # Browser for viewing and selecting scores
β”‚   β”‚  β”œβ”€β”€ score_creator # Editor for creating new scores
β”‚   β”‚  └── score_viewer # Displays score and handles page flipping
β”œβ”€β”€ test # Automated tests. Consists of unit tests
β”œβ”€β”€ pubspec.yaml # Contains all the dependencies for the app
└── README.md # This file

πŸ–ΌοΈ Presentation

The user interface is in lib/features. Each feature is contained in its own directory and consists of screen(s) and/or widgets. The UI layer is responsible for communicating with the business logic layer.

note: not all the logic and UI is completely separated

πŸ“± Business logic

The business logic is also contained in lib/features. When state management becomes complex, we switch to blocs (using the Business Logic Component pattern). Complex features consist of a bloc and event and state classes. The bloc class contains the business logic and the event and state classes are used to communicate with the bloc. The bloc class is also responsible for communicating with the data layer through the repositories.

πŸ“ Models

Models are in lib/common/models. This folder contains the data models used throughout the app. Currently there is only one model, Score, which represents a score.

πŸ“¦ Data

Data is handled in lib/common/data. This folder contains the logic for fetching and storing data. The repositories are responsible for communicating with the data sources. The data sources are responsible for fetching and storing data from the respective sources: local database with the Flutter SQLite plugin sqflite and local filestorage with dart:io and path_provider.

πŸ§ͺ Testing

Tests are in test. Currently, there are only unit tests that test the models and datasources. The tests are run using the Flutter test framework.

πŸ™‚ Facial Gesture Tracking

The gesture tracking leverages ML Kit's face detection API for precise landmarking and rotational information. When the user's head rotation surpasses a predefined threshold, the app flips to the next page. The app waits for the user's head to return below the threshold to reset the process.

Extra

πŸ™ Acknowledgements

@floofysaur - User Interface and Logo Design