Hi, this is good stuff. I have been using on an ESP8266 and I thought you may appreciate my minor additions for a new version if of any use.
As I understand it current recommendations state portions of code that may last longer than 20 millis require a yield() or delay(0) within, to allow the ESP8266 to perform housekeeping tasks for Wifi safely.
With the above in mind I offer you a potential solution below. This does affect tonal quality but makes the library safer to use on this platform.
while(millis() - startTime < duration) { // Loop for the duration.
#ifdef __AVR__
*pinOutput |= pinBit; // Set pin high.
delayMicroseconds(duty); // Square wave duration (how long to leave pin high).
*pinOutput &= ~pinBit; // Set pin low.
#elif defined(ESP8266)
GPOS = (1 << pin); // Set pin high.
delayMicroseconds(duty); // Square wave duration (how long to leave pin high).
GPOC = (1 << pin); // Set pin low
yield();
#else
digitalWrite(pin,HIGH); // Set pin high.
delayMicroseconds(duty); // Square wave duration (how long to leave pin high).
digitalWrite(pin,LOW); // Set pin low.
#endif
delayMicroseconds(frequency - duty); // Square wave duration (how long to leave pin low).
}
Cheers