Stop the reading of notes created with fluidsynth with a button in tkinter
I'm on python2-7 I want to get a button in tkinter which stop the reading of the notes created with fluidsynth.
I found that the common solution is to use time.after like here: How do you create a Tkinter GUI stop button to break an infinite loop?
But in my case I can't use it because I need an amount of time between noteon and noteoff to give durations for my notes.
Moreover I want to play the notes ONLY if I click on start (and no at the beginning like the solution in the link).
So I created this code but it doesn't work because var_start is always initialized as int:
from tkinter import*
import fluidsynth
import time
fs=fluidsynth.Synth()
fs.start(driver='alsa', midi_driver='alsa_seq')
org_charge = fs.sfload("organ.sf2")
fs.program_select(0,org_charge, 0, 0)
time.sleep(1)
var_start=int
def start():
global var_start
var_start=1
def stop():
global var_start
var_start=0
root=Tk()
if var_start==1:
fs.noteon(0,67,127)
time.sleep(1)
fs.noteoff(0,67)
fs.noteon(0,71,127)
time.sleep(1)
fs.noteoff(0,71)
fs.noteon(0,74,127)
time.sleep(1)
fs.noteoff(0,74)
Button(root, text='start', command= start).pack(padx=10, pady=10)
Button(root, text='stop', command= stop).pack(padx=10, pady=10)
root.mainloop()
I don't have other idea to reshape my code...
Can someone help me ?
Thanks
python-2.7 tkinter fluidsynth
add a comment |
I'm on python2-7 I want to get a button in tkinter which stop the reading of the notes created with fluidsynth.
I found that the common solution is to use time.after like here: How do you create a Tkinter GUI stop button to break an infinite loop?
But in my case I can't use it because I need an amount of time between noteon and noteoff to give durations for my notes.
Moreover I want to play the notes ONLY if I click on start (and no at the beginning like the solution in the link).
So I created this code but it doesn't work because var_start is always initialized as int:
from tkinter import*
import fluidsynth
import time
fs=fluidsynth.Synth()
fs.start(driver='alsa', midi_driver='alsa_seq')
org_charge = fs.sfload("organ.sf2")
fs.program_select(0,org_charge, 0, 0)
time.sleep(1)
var_start=int
def start():
global var_start
var_start=1
def stop():
global var_start
var_start=0
root=Tk()
if var_start==1:
fs.noteon(0,67,127)
time.sleep(1)
fs.noteoff(0,67)
fs.noteon(0,71,127)
time.sleep(1)
fs.noteoff(0,71)
fs.noteon(0,74,127)
time.sleep(1)
fs.noteoff(0,74)
Button(root, text='start', command= start).pack(padx=10, pady=10)
Button(root, text='stop', command= stop).pack(padx=10, pady=10)
root.mainloop()
I don't have other idea to reshape my code...
Can someone help me ?
Thanks
python-2.7 tkinter fluidsynth
add a comment |
I'm on python2-7 I want to get a button in tkinter which stop the reading of the notes created with fluidsynth.
I found that the common solution is to use time.after like here: How do you create a Tkinter GUI stop button to break an infinite loop?
But in my case I can't use it because I need an amount of time between noteon and noteoff to give durations for my notes.
Moreover I want to play the notes ONLY if I click on start (and no at the beginning like the solution in the link).
So I created this code but it doesn't work because var_start is always initialized as int:
from tkinter import*
import fluidsynth
import time
fs=fluidsynth.Synth()
fs.start(driver='alsa', midi_driver='alsa_seq')
org_charge = fs.sfload("organ.sf2")
fs.program_select(0,org_charge, 0, 0)
time.sleep(1)
var_start=int
def start():
global var_start
var_start=1
def stop():
global var_start
var_start=0
root=Tk()
if var_start==1:
fs.noteon(0,67,127)
time.sleep(1)
fs.noteoff(0,67)
fs.noteon(0,71,127)
time.sleep(1)
fs.noteoff(0,71)
fs.noteon(0,74,127)
time.sleep(1)
fs.noteoff(0,74)
Button(root, text='start', command= start).pack(padx=10, pady=10)
Button(root, text='stop', command= stop).pack(padx=10, pady=10)
root.mainloop()
I don't have other idea to reshape my code...
Can someone help me ?
Thanks
python-2.7 tkinter fluidsynth
I'm on python2-7 I want to get a button in tkinter which stop the reading of the notes created with fluidsynth.
I found that the common solution is to use time.after like here: How do you create a Tkinter GUI stop button to break an infinite loop?
But in my case I can't use it because I need an amount of time between noteon and noteoff to give durations for my notes.
Moreover I want to play the notes ONLY if I click on start (and no at the beginning like the solution in the link).
So I created this code but it doesn't work because var_start is always initialized as int:
from tkinter import*
import fluidsynth
import time
fs=fluidsynth.Synth()
fs.start(driver='alsa', midi_driver='alsa_seq')
org_charge = fs.sfload("organ.sf2")
fs.program_select(0,org_charge, 0, 0)
time.sleep(1)
var_start=int
def start():
global var_start
var_start=1
def stop():
global var_start
var_start=0
root=Tk()
if var_start==1:
fs.noteon(0,67,127)
time.sleep(1)
fs.noteoff(0,67)
fs.noteon(0,71,127)
time.sleep(1)
fs.noteoff(0,71)
fs.noteon(0,74,127)
time.sleep(1)
fs.noteoff(0,74)
Button(root, text='start', command= start).pack(padx=10, pady=10)
Button(root, text='stop', command= stop).pack(padx=10, pady=10)
root.mainloop()
I don't have other idea to reshape my code...
Can someone help me ?
Thanks
python-2.7 tkinter fluidsynth
python-2.7 tkinter fluidsynth
asked Jan 2 at 21:06
CaptainCoding7CaptainCoding7
52
52
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You initiated var_start
to int
in statement var_start=int
and so the code block in if var_start==1:
will never be executed. And your start()
function is just changing the var_start
to 1 and never start playing the notes, therefore nothing will happen.
Never call time.sleep()
in main thread as it will block the tkinter
main loop. You can use .after(...)
to simulate the play loop and below is a sample code block:
playing = False
def play_notes(notes, index, noteoff):
global playing
if noteoff:
fs.noteoff(0, notes[index])
index += 1 # next note
if playing and index < len(notes):
fs.noteon(0, notes[index], 127)
# call noteoff one second later
root.after(1000, play_notes, notes, index, True)
else:
# either stopped or no more note to play
playing = False
print('done playing')
def start_playing():
global playing
if not playing:
print('start playing')
playing = True
notes = [67, 71, 74, 88, 80, 91]
play_notes(notes, 0, False)
else:
print('already playing')
def stop_playing():
global playing
if playing:
playing = False
print('stop playing')
else:
print('nothing playing')
Button(root, text='Start', command=start_playing).pack(padx=10, pady=10)
Button(root, text='Stop', command=stop_playing).pack(padx=10, pady=10)
It is just an example you can modify to suit your need.
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
add a comment |
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54013183%2fstop-the-reading-of-notes-created-with-fluidsynth-with-a-button-in-tkinter%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You initiated var_start
to int
in statement var_start=int
and so the code block in if var_start==1:
will never be executed. And your start()
function is just changing the var_start
to 1 and never start playing the notes, therefore nothing will happen.
Never call time.sleep()
in main thread as it will block the tkinter
main loop. You can use .after(...)
to simulate the play loop and below is a sample code block:
playing = False
def play_notes(notes, index, noteoff):
global playing
if noteoff:
fs.noteoff(0, notes[index])
index += 1 # next note
if playing and index < len(notes):
fs.noteon(0, notes[index], 127)
# call noteoff one second later
root.after(1000, play_notes, notes, index, True)
else:
# either stopped or no more note to play
playing = False
print('done playing')
def start_playing():
global playing
if not playing:
print('start playing')
playing = True
notes = [67, 71, 74, 88, 80, 91]
play_notes(notes, 0, False)
else:
print('already playing')
def stop_playing():
global playing
if playing:
playing = False
print('stop playing')
else:
print('nothing playing')
Button(root, text='Start', command=start_playing).pack(padx=10, pady=10)
Button(root, text='Stop', command=stop_playing).pack(padx=10, pady=10)
It is just an example you can modify to suit your need.
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
add a comment |
You initiated var_start
to int
in statement var_start=int
and so the code block in if var_start==1:
will never be executed. And your start()
function is just changing the var_start
to 1 and never start playing the notes, therefore nothing will happen.
Never call time.sleep()
in main thread as it will block the tkinter
main loop. You can use .after(...)
to simulate the play loop and below is a sample code block:
playing = False
def play_notes(notes, index, noteoff):
global playing
if noteoff:
fs.noteoff(0, notes[index])
index += 1 # next note
if playing and index < len(notes):
fs.noteon(0, notes[index], 127)
# call noteoff one second later
root.after(1000, play_notes, notes, index, True)
else:
# either stopped or no more note to play
playing = False
print('done playing')
def start_playing():
global playing
if not playing:
print('start playing')
playing = True
notes = [67, 71, 74, 88, 80, 91]
play_notes(notes, 0, False)
else:
print('already playing')
def stop_playing():
global playing
if playing:
playing = False
print('stop playing')
else:
print('nothing playing')
Button(root, text='Start', command=start_playing).pack(padx=10, pady=10)
Button(root, text='Stop', command=stop_playing).pack(padx=10, pady=10)
It is just an example you can modify to suit your need.
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
add a comment |
You initiated var_start
to int
in statement var_start=int
and so the code block in if var_start==1:
will never be executed. And your start()
function is just changing the var_start
to 1 and never start playing the notes, therefore nothing will happen.
Never call time.sleep()
in main thread as it will block the tkinter
main loop. You can use .after(...)
to simulate the play loop and below is a sample code block:
playing = False
def play_notes(notes, index, noteoff):
global playing
if noteoff:
fs.noteoff(0, notes[index])
index += 1 # next note
if playing and index < len(notes):
fs.noteon(0, notes[index], 127)
# call noteoff one second later
root.after(1000, play_notes, notes, index, True)
else:
# either stopped or no more note to play
playing = False
print('done playing')
def start_playing():
global playing
if not playing:
print('start playing')
playing = True
notes = [67, 71, 74, 88, 80, 91]
play_notes(notes, 0, False)
else:
print('already playing')
def stop_playing():
global playing
if playing:
playing = False
print('stop playing')
else:
print('nothing playing')
Button(root, text='Start', command=start_playing).pack(padx=10, pady=10)
Button(root, text='Stop', command=stop_playing).pack(padx=10, pady=10)
It is just an example you can modify to suit your need.
You initiated var_start
to int
in statement var_start=int
and so the code block in if var_start==1:
will never be executed. And your start()
function is just changing the var_start
to 1 and never start playing the notes, therefore nothing will happen.
Never call time.sleep()
in main thread as it will block the tkinter
main loop. You can use .after(...)
to simulate the play loop and below is a sample code block:
playing = False
def play_notes(notes, index, noteoff):
global playing
if noteoff:
fs.noteoff(0, notes[index])
index += 1 # next note
if playing and index < len(notes):
fs.noteon(0, notes[index], 127)
# call noteoff one second later
root.after(1000, play_notes, notes, index, True)
else:
# either stopped or no more note to play
playing = False
print('done playing')
def start_playing():
global playing
if not playing:
print('start playing')
playing = True
notes = [67, 71, 74, 88, 80, 91]
play_notes(notes, 0, False)
else:
print('already playing')
def stop_playing():
global playing
if playing:
playing = False
print('stop playing')
else:
print('nothing playing')
Button(root, text='Start', command=start_playing).pack(padx=10, pady=10)
Button(root, text='Stop', command=stop_playing).pack(padx=10, pady=10)
It is just an example you can modify to suit your need.
answered Jan 3 at 7:22
acw1668acw1668
2,7502716
2,7502716
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
add a comment |
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
Thanks for your help acw1668 ! It works perfectly now !
– CaptainCoding7
Jan 4 at 20:47
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54013183%2fstop-the-reading-of-notes-created-with-fluidsynth-with-a-button-in-tkinter%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown