Я делаю аккорд-приложение, которое помогает изучить теорию музыки c. Для игры аккордов я использую библиотеку flutter_midi (https://github.com/rodydavis/flutter_midi/tree/master/flutter_midi).
final _flutterMidi = FlutterMidi();
@override
void initState() {
load('assets/piano.SF2');
super.initState();
}
void load(String asset) async {
_flutterMidi.unmute(); // Optionally Unmute
ByteData _byte = await rootBundle.load(asset);
_flutterMidi.prepare(sf2: _byte);
}
void _play(int midi) {
_flutterMidi.playMidiNote(midi: midi);
}
И у меня есть 4 кнопки, которые
void _chordplay(List<int> list) {
list.forEach((x) {
_play(x);
});
}
void _chordplay_two_outputs() {
_chordplay([60, 64, 67, 71]);
Future.delayed(const Duration(milliseconds: 1200), () {
_chordplay([62, 66, 69]);
Future.delayed(const Duration(milliseconds: 1200), () {
_chordplay([67, 71, 74]);
}
////////////////////////////////////////
Widget chordC(String buttonText) {
return Expanded(
child: FlatButton(
child: Text(
"C",
style: TextStyle(fontSize: 18.0, color: Colors.grey),
),
onPressed: () => _chordplay([60, 64, 67, 71]),
),
);
}
Widget chordDm(String buttonText) {
return Expanded(
child: FlatButton(
child: Text(
"Dm",
style: TextStyle(fontSize: 18.0, color: Colors.grey),
),
onPressed: () => _chordplay([62, 66, 69]),
),
);
}
Widget chordG(String buttonText) {
return Expanded(
child: FlatButton(
child: Text(
"G",
style: TextStyle(fontSize: 18.0, color: Colors.grey),
),
onPressed: () => _chordplay([67, 71, 74]),
),
);
}
Widget playAll(String buttonText) {
return Expanded(
child: FlatButton(
child: Text(
"playAll",
style: TextStyle(fontSize: 18.0, color: Colors.grey),
),
onPressed: () => _chordplay([67, 71, 74]),
),
);
}
Работает хорошо.
Нажатие каждой кнопки аккордов (C, Dm, G) воспроизводит аккорды (миди). нажатие PlayAll воспроизводит каждый аккорд в последовательности.
Но я хочу решить следующее: если я нажму кнопку playAll
и сразу же нажму кнопку C
, я ожидаю, что функция playAll
остановится. Но он будет работать одновременно.
Аналогичным образом, если я нажму кнопку Dm
и сразу же нажму кнопку playAll
, я хочу прекратить воспроизведение функции C chord
.
Можно ли прекратить вызов существующего функция при вызове новой функции? Буду признателен, если вы поможете мне.