Code Monkey home page Code Monkey logo

metronome's People

Contributors

cwilso avatar neuhaus avatar nofatclips avatar zoramite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

metronome's Issues

License?

Is this released under an FOSS license and if so can you include it in the repo or README?

Metronome no long runs in background tab in Chrome 55

Hi Chris,

I use this approach for metronome timing in Tone.js. One great thing about using a WebWorker like you do is that it runs in a background tab. But, I was just running this on Chrome Canary (55.0.2856.0) and I noticed this is no longer the case. It seems to get throttled just like events scheduled from requestAnimationFrame.

Background scheduling of Web Audio is a wonderful thing and it'd be a shame to lose it in Chrome (still works the same in Safari and FF though). I'm wondering if you have any thoughts or work arounds for this.

Thanks!

First note is clipped

After starting the metronome, the first note is always clipped and generates a click.

It is easier to tell when the metronome is set to quarter notes or slowed to a low tempo.

Changing audio file

Hi mate,

I managed to make your metronome work on an Ionic mobile app, but i need to change the audio file to some other 4 options of audio.

I'm reading your code but im not finding the best way to do that.
Can you give me a hint?

Thanks and great work!

metronome with microphone

Great job. Thanks for that.
Well I think I got an isse here. If you turns on the microphone to record something on the same page, the metronome stops working. Any idea of what is going on?

Some comments in metronome.js about pitch seem wrong

I am not good at music or coding at all, so I am sorry if my question is too stupid.

Some comments in metronome.js (https://github.com/cwilso/metronome/blob/master/js/metronome.js) about pitch confuse me -
Line 58 - if (beatNumber % 16 === 0) // beat 0 == low pitch <- should this actually a high pitch note?
osc.frequency.value = 880.0;
Line 62 else // other 16th notes = high pitch <- should these actually low pitch notes?
osc.frequency.value = 220.0;

AudioContext dies (silently) in IOS14 Safari on iPad

If the tab with the metronome app is made inactive the AudioContext is 'suspended' / 'interrupted' and has to be manually re-started with audioContext.resume(); in the play() function once the tab is made active again. (see https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/state)

This works on Chrome, but not in Safari. AudioContext is apparently re-started and running in Safari, but the audio clock is frozen leaving the application dead. The only workround I have found is to detect the 'suspended' or 'interrupted' state and then close the AudioContext and make a new one (plus any associated nodes like gain).

This then works in both Safari and Chrome. (see https://github.com/nmcgann/metronome for this fix and various other added features)

Live app doesn't work on Firefox

There is an issue with the live app in Firefox. When you change the BPM slider the number isn't updated.

The problem appears to be that you include a non HTTPS script in a HTTPS page. The javascript console reported an error and referred to an explanation.

The script is accessible via HTTPS so the fix is trivial.
I suggest you change the line

  <script src="http://cwilso.github.io/AudioContext-MonkeyPatch/AudioContextMonkeyPatch.js"></script>

to

 <script src="//cwilso.github.io/AudioContext-MonkeyPatch/AudioContextMonkeyPatch.js"></script>

That way it will work with both HTTP and HTTPS pages.

Difference in time between the visual and the auditory

I see a difference in time between the visual and the auditory, I can not say why. But where I notice the most is with Google Chrome on Android. Would you know how to correct it? Thank you. I'm sorry for my English.

How to use metronome to 'sync' with an audio / video source

Hi,

I was wondering if someone can help me along. I'm playing with metronome, hoping I can use it to (manually) align it with a media track (audio or video).

I can play both and play with the tempo in the metronome, but have a hard time figuring how to align them.

Let's say the beat (120bmp) starts at 4.5 seconds in my media track. how do I 'offset' the metronome to align it's beat and also 'start' at 4.5 seconds?

Any advice?

Metronome stops working when you change to a different tab

I suspect this is related to using requestAnimationFrame.

I am aware that requestAnimationFrame is preferable to using setTimeout or setInterval, but I'm curious what you would recommend for making a web audio app where you want playback to continue even if you switch to another tab in the browser.

It seems more suited to games (as its name implies) where if you leave the tab there is no need to redraw the page cause you can't see it anymore. Maybe we need a requestAudioFrame?

I also am not sure if this is something specific to my computer and how Chrome optimizes repainting or if it is a more general issue.

Thanks.

Moving metronome canvas

I am very new to JS. I was wondering if there was any way to insert a line of code into a

to re-position the visual metronome canvas.

How to implement this solution in MIDI.js ?

Hello I use MIDI.js in my App to play sequence of notes.
I have array of notes and array of delay, and I iterate though it using for loop.

var notes = [67, 78, 67 ,67,90, 56,..,...,....]
var delay = [.........]
for(var i=0; l < notes.length; i++)
{
MIDI.noteOn(channel, notes[i], velocity, delay[i]);
}

When array of notes is long [ 300+ ] then result is not good and browser struggles to play such long sequence.

Is it possible to schedule partial number of notes [ 25 notes ] at any given time and when it is close to finish that sequence then schedule next 25 notes so that load on browser can be controlled to get good result ?

For reference, here is the code of midi.noteOn function of MIDI.js which uses setTimeout function to play notes.

midi.noteOn = function(channelId, noteId, velocity, delay) {
			delay = delay || 0;

			/// check whether the note exists
			var channel = root.channels[channelId];
			var instrument = channel.instrument;
			var bufferId = instrument + '' + noteId;
			var buffer = audioBuffers[bufferId];
			if (!buffer) {
// 				console.log(MIDI.GM.byId[instrument].id, instrument, channelId);
				return;
			}

			/// convert relative delay to absolute delay
			if (delay < ctx.currentTime) {
				delay += ctx.currentTime;
			}
		
			/// create audio buffer
			if (useStreamingBuffer) {
				var source = ctx.createMediaElementSource(buffer);
			} else { // XMLHTTP buffer
				var source = ctx.createBufferSource();
				source.buffer = buffer;
			}

			/// add effects to buffer
			if (effects) {
				var chain = source;
				for (var key in effects) {
					chain.connect(effects[key].input);
					chain = effects[key];
				}
			}
			/// add gain + pitchShift
			var gain = (velocity / 127) * (masterVolume / 127) * 2 - 1;
			source.connect(ctx.destination);
			source.detune.value = detuneCents;
			source.playbackRate.value = 1; // pitch shift 
			source.gainNode = ctx.createGain(); // gain
			source.gainNode.connect(ctx.destination);
			source.gainNode.gain.value = Math.min(1.0, Math.max(-1.0, gain));
			source.connect(source.gainNode);
			if (useStreamingBuffer) {
				if (delay) {
					return setTimeout(function() {
						buffer.currentTime = 0;
						buffer.play()
					}, delay * 1000);
				} else {
					buffer.currentTime = 0;
					buffer.play()
				}
			} else {
				source.start(delay || 0);
			}
			///
			sources[channelId + '' + noteId] = source;
			///
			return source;
		};

Nothing happens in Safari on iOS

When I try the demo in iOS on Safari, nothing happens. There's nothing in the error console either. It's ok on desktop Safari.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.