Skip to content

Commit

Permalink
Adding Haptic Feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
Rody Davis committed Feb 24, 2019
1 parent 7e34009 commit 2b51c3c
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 89 deletions.
3 changes: 3 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.appleeducate.flutter_piano">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>

<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
Expand Down
10 changes: 8 additions & 2 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,34 @@ PODS:
- Flutter
- shared_preferences (0.0.1):
- Flutter
- vibrate (0.0.1):
- Flutter

DEPENDENCIES:
- Flutter (from `.symlinks/flutter/ios`)
- Flutter (from `.symlinks/flutter/ios-release`)
- flutter_midi (from `.symlinks/plugins/flutter_midi/ios`)
- path_provider (from `.symlinks/plugins/path_provider/ios`)
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
- vibrate (from `.symlinks/plugins/vibrate/ios`)

EXTERNAL SOURCES:
Flutter:
:path: ".symlinks/flutter/ios"
:path: ".symlinks/flutter/ios-release"
flutter_midi:
:path: ".symlinks/plugins/flutter_midi/ios"
path_provider:
:path: ".symlinks/plugins/path_provider/ios"
shared_preferences:
:path: ".symlinks/plugins/shared_preferences/ios"
vibrate:
:path: ".symlinks/plugins/vibrate/ios"

SPEC CHECKSUMS:
Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296
flutter_midi: f2346c9598a8330d6ce607ba63192f42e8d530ae
path_provider: 09407919825bfe3c2deae39453b7a5b44f467873
shared_preferences: 5a1d487c427ee18fcd3ea1f2a131569481834b53
vibrate: 8d9cb77859e02b88730c44a9907f561ddca25ca1

PODFILE CHECKSUM: ebd43b443038e611b86ede96e613bd6033c49497

Expand Down
4 changes: 3 additions & 1 deletion ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -273,10 +273,11 @@
);
inputPaths = (
"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
"${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework",
"${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework",
"${BUILT_PRODUCTS_DIR}/flutter_midi/flutter_midi.framework",
"${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
"${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework",
"${BUILT_PRODUCTS_DIR}/vibrate/vibrate.framework",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
Expand All @@ -286,6 +287,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_midi.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/vibrate.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
Expand Down
7 changes: 6 additions & 1 deletion lib/ui/common/piano_key.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_midi/flutter_midi.dart';
import 'package:tonic/tonic.dart';
import 'package:vibrate/vibrate.dart';

class PianoKey extends StatelessWidget {
const PianoKey({
Expand All @@ -9,13 +10,15 @@ class PianoKey extends StatelessWidget {
this.accidental,
@required this.showLabels,
@required this.labelsOnlyOctaves,
this.feedback,
});

final bool accidental;
final double keyWidth;
final int midi;
final bool showLabels;
final bool labelsOnlyOctaves;
final bool feedback;

@override
Widget build(BuildContext context) {
Expand All @@ -31,7 +34,9 @@ class PianoKey extends StatelessWidget {
child: InkWell(
borderRadius: _borderRadius,
highlightColor: Colors.grey,
onTap: () {},
onTap: () {
if (feedback) Vibrate.feedback(FeedbackType.light);
},
onTapDown: (_) => FlutterMidi.playMidiNote(midi: midi),
))),
Positioned(
Expand Down
109 changes: 25 additions & 84 deletions lib/ui/common/piano_octave.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,67 +8,27 @@ class PianoOctave extends StatelessWidget {
this.octave,
@required this.showLabels,
@required this.labelsOnlyOctaves,
this.feedback,
});

final double keyWidth;
final int octave;
final bool showLabels;
final bool labelsOnlyOctaves;
final bool feedback;

@override
Widget build(BuildContext context) {
return SafeArea(
child: Stack(children: <Widget>[
Row(mainAxisSize: MainAxisSize.min, children: <Widget>[
PianoKey(
midi: 24 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 26 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 28 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 29 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 31 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 33 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 35 + octave,
accidental: false,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
_buildKey(24, false),
_buildKey(26, false),
_buildKey(28, false),
_buildKey(29, false),
_buildKey(31, false),
_buildKey(33, false),
_buildKey(35, false),
]),
Positioned(
left: 0.0,
Expand All @@ -80,45 +40,26 @@ class PianoOctave extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(width: keyWidth * .5),
PianoKey(
midi: 25 + octave,
accidental: true,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 27 + octave,
accidental: true,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
_buildKey(25, true),
_buildKey(27, true),
Container(width: keyWidth),
PianoKey(
midi: 30 + octave,
accidental: true,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 32 + octave,
accidental: true,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
PianoKey(
midi: 34 + octave,
accidental: true,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
),
_buildKey(30, true),
_buildKey(32, true),
_buildKey(34, true),
Container(width: keyWidth * .5),
])),
]),
);
}

Widget _buildKey(int midi, bool accidental) {
return PianoKey(
midi: midi + octave,
accidental: accidental,
keyWidth: keyWidth,
showLabels: showLabels,
labelsOnlyOctaves: labelsOnlyOctaves,
feedback: feedback,
);
}
}
3 changes: 3 additions & 0 deletions lib/ui/common/piano_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ class PianoView extends StatefulWidget {
this.keyWidth,
@required this.labelsOnlyOctaves,
this.disableScroll,
this.feedback,
});

final double keyWidth;
final bool showLabels;
final bool labelsOnlyOctaves;
final bool disableScroll;
final bool feedback;

@override
_PianoViewState createState() => _PianoViewState();
Expand Down Expand Up @@ -64,6 +66,7 @@ class _PianoViewState extends State<PianoView> {
keyWidth: widget.keyWidth,
showLabels: widget.showLabels,
labelsOnlyOctaves: widget.labelsOnlyOctaves,
feedback: widget.feedback,
);
},
),
Expand Down
28 changes: 28 additions & 0 deletions lib/ui/home/screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_midi/flutter_midi.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:vibrate/vibrate.dart';

import '../common/piano_view.dart';

Expand Down Expand Up @@ -32,6 +33,12 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
FlutterMidi.prepare(sf2: sf2, name: "Piano.sf2");
});
_loadSettings();
Vibrate.canVibrate.then((vibrate) {
if (!_isDisposed)
setState(() {
canVibrate = vibrate;
});
});
}

void _loadSettings() async {
Expand All @@ -42,6 +49,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
_showLabels = prefs.getBool("labels") ?? true;
_labelsOnlyOctaves = prefs.getBool("octaves") ?? false;
_disableScroll = prefs.getBool("scroll") ?? false;
shouldVibrate = prefs.getBool("vibrate") ?? true;
});
}

Expand All @@ -56,6 +64,8 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
bool _showLabels = true;
bool _labelsOnlyOctaves = true;
bool _disableScroll = false;
bool canVibrate = false;
bool shouldVibrate = true;

@override
Widget build(BuildContext context) {
Expand Down Expand Up @@ -107,6 +117,20 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
if (!_isDisposed) setState(() => _disableScroll = value);
prefs.setBool("scroll", value);
})),
Divider(),
Container(
child: canVibrate
? ListTile(
title: Text("Key Feedback"),
trailing: Switch(
value: shouldVibrate,
onChanged: (bool value) {
if (!_isDisposed)
setState(() => shouldVibrate = value);
prefs.setBool("vibrate", value);
}))
: null,
),
]),
)),
appBar: AppBar(
Expand All @@ -122,6 +146,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
}

Widget _buildKeys(BuildContext context) {
final _vibrate = shouldVibrate && canVibrate;
if (MediaQuery.of(context).size.height > 600) {
return Flex(
direction: Axis.vertical,
Expand All @@ -132,6 +157,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
showLabels: _showLabels,
labelsOnlyOctaves: _labelsOnlyOctaves,
disableScroll: _disableScroll,
feedback: _vibrate,
),
),
Flexible(
Expand All @@ -140,6 +166,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
showLabels: _showLabels,
labelsOnlyOctaves: _labelsOnlyOctaves,
disableScroll: _disableScroll,
feedback: _vibrate,
),
),
],
Expand All @@ -150,6 +177,7 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
showLabels: _showLabels,
labelsOnlyOctaves: _labelsOnlyOctaves,
disableScroll: _disableScroll,
feedback: _vibrate,
);
}
}
7 changes: 7 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.8"
vibrate:
dependency: "direct main"
description:
name: vibrate
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.4"
sdks:
dart: ">=2.1.1-dev.0.0 <3.0.0"
flutter: ">=0.1.4 <2.0.0"
3 changes: 2 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: flutter_piano
description: A Crossplatform Midi Piano built with Flutter.
author: Rody Davis Jr <rody.davis.jr@gmail.com>
homepage: https://github.com/AppleEducate/flutter_piano
version: 1.0.0+2
version: 1.0.0+4

environment:
sdk: ">=2.0.0 <3.0.0"
Expand All @@ -14,6 +14,7 @@ dependencies:
flutter_midi: ^0.1.1+3
shared_preferences: ^0.5.1+1
cupertino_icons: ^0.1.2
vibrate: ^0.0.4

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit 2b51c3c

Please sign in to comment.