Pick Pro

Empowering guitarists to learn their favourite songs.

Flutter

Dart

React.js

CSS

Figma

Apple Development Suite

Xcode

Android Studio

Mobile Development

CONTEXT

Why is Everything so Expensive these Days?

My inspiration for creating PickPro came from my dissatisfaction with the resources currently available for learning electric guitar. Not only were different resources often spread across multiple sites, many sites also locked key features behind paywalls that I didn't want to pay. Most prominent among them all, however, was the lack of readily available audio players with fine-tuned playback speed customization. Services like YouTube Music limit customizations to increments of 0.25 - 0.5x, gaps that are simply too large for a novice guitarist like myself to jump between when playing along.

OVERVIEW

PickPro is a mobile app created in Flutter that is compatible with both Android and iOS devices. The app contains numerous features to help novice guitarists improve their guitar picking skills.

METRONOME

Stay in Time, For All Time.

PickPro includes a custom-built, animated metronome that can be adjusted with the BPM text field or by sliding the counter-weight on the metronome stick. The metronome animation was created using Flutter's Tween Object. Using a separate frame timer, the angle for the wand as well as the required CurveTween is calculated using the method below:

double _getAngle() {
    double angle = 0.0;
    double segmentPercent;
    double begin;
    double end;
    Curve curve;
            
    int now = DateTime.now().millisecondsSinceEpoch;
    double rotatePercent = 0;
            
    if (_metronomePlayer.metronomeIs == MetronomeIs.playing ||
        _metronomePlayer.metronomeIs == MetronomeIs.stopping) {
        int timePassed = now - _metronomePlayer.lastEvenTick;
            
        // Reset time interval if tick animation is delayed
        if (timePassed > _metronomePlayer.interval * 2) {
            timePassed -= (_metronomePlayer.interval * 2);
        }
            
        rotatePercent = (timePassed).toDouble() / (_metronomePlayer.interval * 2);
            
        // Restricting rotation in case of extreme intervals
        if (rotatePercent < 0 || rotatePercent > 1) {
            rotatePercent = min(1, max(0, rotatePercent));
        }
    }
            
    // Customize curve and angles depending on the rotation needed
    if (rotatePercent < 0.25) {
        segmentPercent = rotatePercent * 4;
        begin = 0;
        end = _maxAngle;
        curve = Curves.easeOut;
    } else if (rotatePercent < 0.75) {
        segmentPercent = (rotatePercent - 0.25) * 2;
        begin = _maxAngle;
        end = -_maxAngle;
        curve = Curves.easeInOut;
    } else {
        segmentPercent = (rotatePercent - 0.75) * 4;
        begin = -_maxAngle;
        end = 0;
        curve = Curves.easeIn;
    }
            
    // The Curve Tween is used to create the pendulum-swinging curve
    CurveTween curveTween = CurveTween(curve: curve);
    double easedPercent = curveTween.transform(segmentPercent);
            
    Tween<double> tween = Tween<double>(begin: begin, end: end);
    angle = tween.transform(easedPercent);
            
    return angle;
}

CHORDS REFERENCE

All Your Learning Needs, In One Place.

PickPro features a searchable chords list that includes a variation of every single guitar chord. Each chord can be easily found by searching for the note name as well as the tune.

AUDIO PLAYER

Learn Your Favourite Songs, at Your Own Pace.

The main functionality of PickPro is its audio player. By uploading their own music to the app, users can play their songs at custom and precise playback speeds. Users can fine-tune the desired playback speed within 2 decimal places, allowing them to slowly work their way up to playing along at normal speed.

FUTURE IMPROVEMENTS

What's Next?

The most glaring limitation with PickPro in its current state is the audio player's departure from BPM. Unless the user already knows the BPM of the song, there is no way to sync up the metronome function with the audio player; even if the BPM is known, the only way to sync these functions is by manually timing the playback of the song with the metronome. To solve this issue, there are two main upcoming functionalities that I would like to implement in the audio player. One is the ability to recognize the BPM of the song, and the other is to sync the playback of the song with the built-in metronome. As there exists software capable of recognizing BPM from audio files, the main issue will be implementing such software in Flutter.

Regardless, I believe that even in its current state, PickPro is an extremely useful tool for guitarists of all skill levels and I plan on continuing to use it myself to further my own guitar skills.

CREATED BY DAVID TAM

LONDON, ON, CANADA