Just run fast through loop() without delays and you will be plenty fast enough -- a few microseconds, maybe as fast as 1 microsecond per pass.

Before you code, make your plan. Something like this perhaps?------------------------------------------------------------------------------------Start loop()Read the pinDid the pin change state from LOW to HIGH? (or HIGH to LOW, however you count the pulse){ Yes -- add 1 to pulse count Is pulse count > what you want? { Yes -- do whatever you do when pulse count has reached the limit Zero pulse count } Save the pin state so you know when it changes again.}else{ Did the pin change state from HIGH to LOW? { Yes -- save the pin state so you know when it changes again. }}End loop() -- takes you back to the Start------------------------------------------------------------------------------------

What is missing is "whatever you do when pulse count has reached the limit".Do that with the least steps possible. You should be able to get away with serial print given the long pulse times you first posted (longer than a second? with tight code, 10 millis is long!) and the 100-120 pulses you're counting. The great majority (over 99%) of passes through loop() would see no change in pin state at all. Count those (use an unsigned or unsigned long) and see, you will likely be surprised and maybe learn how really fast loop code is.

You know those finger-tip-clamp pulse monitors at hospitals? I wonder if they work by light reflected or light passed through the very finger tip? There is a bright red light without heat involved.

I imagine a piezo could do the job of electronic stethoscope. Biggest part of that is separating heart beat from other body noises. Piezo is sensitive enough given that they can be used to detect ants walking on them.