Let's Learn About Waveforms
waveforms.surge.sh
waveforms.surge.sh
"Pitch" is the human perception of how high or low a tone is. Pitch is a "quale", it is purely perceptual, and not measured in Hz. We perceive one pitch for a guitar tone, even though it is made up of many frequencies (like the sawtooth example).
A related technical term is "Fundamental Frequency" or "Base Frequency", which is the lowest frequency in a harmonic tone complex.
In most cases, pitch correlates with the fundamental frequency. But not always. For example, pianos are not strictly harmonic, their higher harmonics are slightly higher than integer multiples of the fundamental. Yet we perceive a single pitch. Another example: If we cut off the lowest harmonics and fundamental using a filter (like in some telephones or cheap loudspeakers), we still perceive the pitch as that missing harmonic. Another example: If you play different harmonics on different ears, we still perceive it as one homogenous tone. Another one: You can play two tones with offset fundamental frequencies such that we should hear a common fundamental below either tone. But we don't, because our brain somehow separates co-modulated tones into distinct auditory objects.
It is endlessly fascinating how human perception works, and "pitch" is surprisingly nuanced and complex if you look into it deeply.
I think you mean missing fundamental here.
But aside from that, you make some very good points. The human brain has some amazing abilities to understand what physical phenomenon might have caused the frequencies it's picking up, even if it isn't getting all of them.
And yeah, human perception of sound was something I had wanted to explore more, but I didn't want it to be even longer... might be interesting as a follow-up (although I don't know exactly how to visualize it...
Thanks for the feedback :)
Now if you pushed it too the limit and went on to digital sampling and compression codecs and ended with the Fourier transform... That would be something legendary indeed.
Edit: just saw this one in the footer of the Waveforms page. http://www.r2d3.us/visual-intro-to-machine-learning-part-1/
http://www.r2d3.us/visual-intro-to-machine-learning-part-1/
Distill has some great ML articles that are kind of similar:
I can't seem to find it now, but either the NY Times or the Washington Post built something similar, for the 2018 US house/senate races. Lots of graphs as you scroll, with scroll-based events, IIRC.
EDIT: ah, how could I forget Nicky Case's explorabl.es! Was a huge inspiration for me as well.
I have a suggestion about the chord:
With a single chord like this I think it sounds better to tune it with "just intonation". For a major chord it is [ f * 1, f * 1.25, f * 1.5 ]. With these frequencies the chord will not wobble.
EDIT: Yep, sounds way better. Will definitely have to look more into this! Thanks again.
But in a technical piece like this, I prefer if it isn't.
"The Ladder of Abstraction" is close to this explicit document style, but if you're interested in the history and philosophy of interactive visualization, you can lose days on that site.
Raft consensus http://thesecretlivesofdata.com/raft/
http://toxicdump.org/stuff/FourierToy.swf
Edit: Oh, it's down. But I'll leave this here in case it's a temporary problem.
3Blue1Brown, by Grant Sanderson, is some combination of math and entertainment, depending on your disposition. The goal is for explanations to be driven by animations and for difficult problems to be made simple with changes in perspective.
Seeing Circles, Sines, and Signals: A Compact Primer on Digital Signal Prcoessing, by Jack Schaedler
As far as progressing even further into DSP, especially for audio processing, I've found https://www.dsprelated.com/freebooks/filters/ to be a good map of the territory. But as someone with a CS degree rather than an engineering or math degree, it's all pretty overwhelming.
The FFT was reinvented by J. Tukey, at Princeton and Bell Labs, at a US Presidential Science Advisors meeting, while Tukey was taking meeting notes with one hand and doing Fourier derivations with the other, from a query from R. Garwin, at IBM's Watson lab. Garwin said he was using too much computer time calculating Fourier transforms, so Tukey showed him the FFT. Later Cooley at IBM programmed the FFT, and Cooley and Tukey published the work. The FFT was revolutionary for signal processing, for sonar, radar, molecular spectroscopy, etc.
The sampling issue is: Suppose have a periodic waveform with highest frequency 20 KHz (kilo Hertz, 1000 cycles per second). Then there is the canonical theorem of interpolation theory that says that can reproduce the wave form exactly from the values of the waveform at equally spaced points 40,000+ times a second, or some such (there is a detail right at the 40,000). There is a cute pseudo-proof based just on pictures!
So, for DFT/FFT, we start with those sampled values, and that's the "discrete" part. E.g., the reason audio CDs use 44 KHz or some such is that they want to be good for music up to 22 KHz. If the music really does have significant power at 22 KHz and we sample at only, say, 15 KHz, then we will have under sampled and end up with distorted music.
A computer sound card or chip has to reverse the discrete sampling and generate a continuous waveform for the audio system and speakers, that is, to analog.
There is a good start on Fourier series (for periodic waveforms) with the math done carefully in W. Rudin, Principles of Mathematical Analysis. If a waveform is not periodic but defined for all time, then we can do the closely related Fourier transform, and there is a nice treatment of the math in W. Rudin, Real and Complex Analysis.
Suppose we have waveforms x(t) and y(t) where t is time and x(t) and y(t) are real numbers. Suppose we also have real numbers a and b. Suppose we are in, say, a concert hall and musicians are playing x(t) and y(t). Suppose due to the concert hall, for function h what we hear from x is h(x). Then we hope and believe that
h( ax + by ) = ah(x) + bh(y)
that is, the the concert hall effect h is a linear operator. If in addition h doesn't change over time, say, yesterday to tomorrow, then, presto, bingo: All h and the concert hall can do to x and y is adjust the volume of the harmonics! Or, a time invariant linear system is a linear operator and, from Fourier theory, a convolution. Here I am simplifying somewhat.
Well, the world is awash in linear systems, especially for sonar and radar. So, one of the big, early uses of DFT/FFT was in analyzing the acoustic signals from reflections from subsurface layers from small explosions at the surface, all for looking for oil.
Yup! You just filled in what I called a "detail"!!!
Just kidding, graycat, I'm a fan! How's your project going? any news?
For the project: The work for the project is as usual fast, fun, and easy but gets delayed by random, external nonsense. But have to expect such random stuff. Between now and going live is all just routine.
The current random nonsense is my development computer got sick: Apparently there was a motherboard problem giving serious data corruption.
I was working up orders for parts for two new computers when the old computer finally seriously quit.
So, I rushed out and just -- horrors -- actually BOUGHT a computer, not just parts but an actual computer. I got an HP laptop with Windows 10 Home Edition.
Then I ordered the parts. They have come now and are ready to plug together.
I deliberately selected parts about one generation out of date.
Why?
(1) My startup software makes some use, actually light, of SQL Server; it insists on ECC (error correcting coding) main memory, and I like it, too.
Apparently ECC main memory needs all of the memory, motherboard, and processor to support ECC. Well, now the easy way to get that is to buy some old parts.
(2) I'm happy using a computer with a good BIOS but don't want to get involved in the newer Unified Extensible Firmware Interface (UEFI).
Why against UEFI? No visible upside for me. Likely big downsides of lots of new architecture I don't need, lots of new complexity I don't want to have to work with, maybe some new bugs, and no doubt rather poor documentation, and less good technical information on the Internet.
Computer Industry: If you don't work hard to document your work, then I'll work hard to avoid your work.
(3) Older parts tend to have fewer bugs and better technical information.
For the case I got a
Thermaltake V3 VL80001W2Z (Black)
It's big, with a 120 mm fan and lots of air holes and places for more fans.
For a motherboard, I considered the
Asus m5a97 R2.0
but gave up as apparently they are now out of production and super hard to find in stock.
So, I settled on the
Asus m5a78l-m-usb3
It's a cute little thing, micro-ATX, a BIOS but no Unified Extensible Firmware Interface (UEFI). It supports ECC (error correcting coding) main memory and has an AM3+ socket for the AMD FX series of processors. I got two of the motherboards from AVADirect in Cleveland.
For main memory the motherboard has four DDR3 slots and can take a total of 32 GB. I was able to find and got 4 DIMMs of DDR3, 4 GB per DIMM, at 1333 MHz with ECC.
The processor is an AMD FX-8350, 64 bit addressing, with 8 cores with a standard clock of 4.0 GHz. Yes it can consume 125 W of power; thus, I will have maybe more than one fan in the case.
For the needs of my startup, that processor, motherboard, and main memory will do a LOT of computing. E.g., my old computer that died had a single core processor at 1.8 GHz, and it had my Web site pages showing on the screen before I could get my finger off the Enter key. My actual software timings indicate that this new FX-8350 computer will have plenty of capacity to do very nicely as a first server.
For disks, I got two Western Digital drives, SATA at 3.0 Gbps, and 500 GB each.
And I will bring over the SATA drives from my old computer.
And I got lots of fans, cables, etc.
Long ago I got tired of wrestling with file system drive letters. So, I have some directories DATA01, DATA02, DATA03, DATA05, PROG01, PROG02, PROG03, and they have all MY data, and my software works fine no matter what drive letters those directories are on or larger trees they are in. I will be using this little approach again.
I have a thing, goal, I want:
In my past work with Windows for this project, too often I had to reinstall Windows and all my other software, and those reinstalls, even with all the practice I got, were a lot of work. So my goal is to solve this problem of reinstalling.
So, I want:
(1) More than one instance of a bootable operating system.
(2) Each installed instance on its own hard disk partition with little or nothing else important on such a partition.
(3) In case a hard disk with a bootable partition fails, bootable partitions on at least two hard disks.
(4) Good backups of the bootable partitions.
So, if something seems wrong with a bootable partition, say, C:, then I will boot another bootable partition, say, D:, and restore C: from a backup.
I want the restore to be fast, easy, and bit-perfect.
So, how to get such bootable partition backups and do such restores? Well, maybe Acronis True Image or the Western Digital Data Lifeguard Tools will be sufficient -- I have fully legal copies of both. In the past I had some really bad times with Microsoft's NTBACKUP, but I'm willing to try again.
But for Acronis, Lifeguard, NTBACKUP, I accept I will have to run some experiments. So, as soon as the computer is running, I will do the experiments and get saving and restoring a bootable partition fast, easy, reliable, and well documented.
Yes, apparently backup and restore of the files for SQL Server requires some special considerations.
So, backup/restore needs are for (A) instances of installed operating systems, (B) files used by SQL Server, and (C) everything else, that is my data.
For (C) my long used solution is just using Microsoft's XCOPY with some carefully selected options and called from one of several scripts I have in Rexx. I have some scripts for full backup of a file system directory sub-tree and also incremental backups.
For the experiments in backup and restore of bootable partitions, I may just use my old legal copy, that before the experiments are over, I will have to reinstall several times, of Windows XP SP2 Professional.
When I get those experiments done I will install a legal copy I have of Windows 7 64 bit Professional, on bootable partitions on at least two bootable drives, get the updates, and backup up the partitions.
Then I will do software installations and do backups again.
Next get SQL Server running again.
Then try to get my old SQL Server data base working again.
My experience doing such things in the past has me suspect that before I get this far I will have to make use of the results of my experiments in restoring bootable partitions.
Then install the .NET Framework and get my startup software running again.
That will be a good day!
I have a few tweaks in mind for the software.
For the code for the crucial core applied math, I want to check that a third time. The last time I checked that code, I got out a lot of trace data, programmed the calculations again independently, and confirmed that on the trace data both codes gave the same results. I want to do that again.
Then I will do some more data collection.
Then I will give a critical review and consider revisions.
Then comes alpha test, beta test, going live, ....
In short, between now and then, it's all just routine work.
That said it's all about the underlying math. If you want something with lots of source code to start playing around with you won't find it here. But since understanding the math is critical to understanding what the source is doing I think both sides are necessary.
Also this is yet another area of CS/engineering where C rules the roost. If you're not comfortable with C you'll have a lot of trouble using actual DSP hardware.
Diving deeper: a 'C' on a piano is actually made up of -multiple- frequencies. The 'same' 'C' on any other instrument is made up of a -different- set of frequencies. See: overtones.
All the other Cs are called C because we perceive them as "the same note."
Ask her to play a tune, and then play it again an octave higher and then lower. The pitch is different, but there's also a sense that all three versions are the same.
Mathematically, pitch is like a helix. Points with the same rotation - which happen to be a frequency ratio of powers of 2 - sound very closely related.
Instead of giving every single note a different name, it's useful to give notes the same repeating set of 12 names and then add a separate "height" variable - called the octave - to describe which turn of the helix they're on.
If you play pitches with the same rotation at the same time they blend well together. In fact you can barely tell them apart.
Of course you can rotate by less than a full circle. If you play the same tune with a different pitch offset - say one note instead of twelve, which is the smallest rotation you can do on a conventional keyboard - you'll hear it's still the same shape, but there's a jarring effect between the different versions.
Some rotations sound good together, but not as good as the identity rotation. Others clash and sound bad.
As a guide, simple divisions of the pitch circle - like 3:2 - sound smoother than the more complicated divisions.
The twelve notes approximate the rotations that sound best together. You get a good mix of smooth and not so smooth blends, and you can build all kinds of combinations with them.
You use approximations and not exact whole number ratios because you want to be able to write music that isn't stuck with a single starting/reference note. You can play the same tune at different starting pitches and the relationships between the notes doesn't change.
If you use whole number ratios a tune that sounds good starting on one note sounds weird and sour starting on others. The pitch spiral turns into an oval corkscrew, and the neat rotations get distorted.
And yes, all the As, Bs, Cs have their own specific frequencies. By convention A = 440Hz, and everything else is tuned around that. All the As are powers of 2 either side of 440Hz - from 27.5Hz, which is the lowest note on a piano, to 3520Hz for the highest A.
Worst case: they argue in vain. Best case: the above happens
the amplitude and frequencies of the overtones are ALL that gives (apart from attack/decay and modulations) any instrument (physical or electronic) playing a single note its individual character.
It'd be really cool if you could demo that.
This is a much bigger factor
if you loop steady state parts of classical instruments it becomes very difficult to differentiate them.
But that importance depends on how different the instruments are already. The saxophone and the clarinet are quite different 'steady state'. Bell and piano are quite different. So I proposed a 'gateway concept'. Else it takes a long time to grok it all.
Eventually the differences all add up to very complex waveforms (I didn't even mention register, which is important for differentiating the classical string families). Personally, I'm glad of this, since the timbre space explored by conventional instruments is a VERY VERY small part of the sonic universe.
But yeah, maybe I could do more to show just how wide the application of this concept is... it's not just limited to abstract waveforms, it's the fundamental rules for all instruments. Will give this some thought (and if you have ideas for how to demo it, let me know!)
Great work by the way!
The OP started saying that the horizontal axis was time but later discussed 180 degrees without connecting degrees with time.
Why the harmonic frequencies are distinct positive whole number multiples of the fundamental frequency? Because the sine waves at those frequencies form an orthogonal coordinate system with all the advantages of such a system in 2 and 3 dimensions we know well. Similarly for linear algebra with positive whole number dimensions. So, right, the periodic waves are in a vector space of countably infinite dimensions. Usually in practice we can get good approximations by considering only the first dozen or two harmonics.
The waves travel according to the wave equation. It would be good to connect with that.
The lecture might have discussed the effect of tone controls and linear systems and linear filtering more generally.
Otherwise, great site! I think it is great that Fourier was basically explained without mentioning his name.
And yeah, hah. My goal was to not mention his name anywhere, since "fourier transforms" just sounds scary and jargony.
The new tool Observable is a pretty friendly / straight-forward way to make this type of thing, for folks who want to get started on making interactive explanations.
Here’s one in the same general area as the link under discussion: https://beta.observablehq.com/@freedmand/sounds
(Observable has the additional benefit that readers are treated as peers/authors and can play with the code directly.)
http://www.synthtopia.com/content/2016/03/19/free-open-sourc...
https://ocw.mit.edu/resources/res-6-007-signals-and-systems-...
come for the wisdom, stay for the 80s polyester ties.
That major chord at the end sounds a little wobbly. Not sure if it's out of tune or tuned exactly to equal temperement and it's just more obviously out of tune with respect to the just intervals because of the timbre.
It would be interesting to have a just major chord (i.e. the 4th, 5th, and 6th harmonics of some note) and compare with the equal tempered triad.
I looked at the code and for the major chord it uses:
[f * 1, f * 1.2599388379204892, f * 1.4984709480122322]
With f = 440Hz it will be [440.000, 554.373, 659.327].
Equal temperament (12-TET) would be:
[f * 1, f * 1,25992104989487, f * 1,49830707687668]
With f = 440Hz it will be [440.000, 554.365, 659.255].
Since it isn't pure it will wobbly a little bit.
In this case it would be better to use "just intonation":
[f * 1, f * 1.25, f * 1.5]
With f = 440Hz it will be [ 440, 550, 660 ].
Thanks for this! To be honest, my music theory isn't that deep; I had never heard of equal temperament or just intonation. I think I just did the math based on a note-to-frequency table I googled. Clearly I have some research to do!
I did find the chord a little "off", but I thought that was just me. Originally, the audible frequencies for the other bits were completely outside the western music scale, and so the chord sounded _really_ off.
That explains why I didn't find what tuning you where using.
By the way, there is no contact information on the page (if there is, I didn't see it when I was looking for it.)
For a just scale, it's a bit more complicated because there are sometimes multiple options. For instance, a minor seventh might be 9/5, 16/9, 12/7, or 7/4 depending on context.
In general, a pretty good "default" 12-note chromatic scale if you want to use JI in a way that works with most normal western music is 1/1, 16/15, 9/8, 6/5, 5/4, 4/3, 45/32, 3/2, 8/5, 5/3, 9/5, and 15/8. (Just multiply the fraction by the frequency of the root note to get the frequency.) 2/1 would be an octave above the root.
Just major chords are three tones that make a 4:5:6 ratio, such as 4/3, 5/3, and 2/1. You can think of a major chord as the 4th, 5th, and 6th harmonic of a note two octaves below the root. (1:3:5 or other octave-equivalents are also major chords.)
If you add on the 7th harmonic to make a 4:5:6:7 chord (and for this you'll need at least one note not on the scale I provided above), you get a barbershop dominant seventh chord.
Just minor chords make a ratio of 10:12:15, which you could also think of as 4/4 : 4/5 : 4/6.
The advantages of just tuning are that it sounds very stable and allows precise distinctions between very similar notes. Equal temperament is an approximation of just intervals and has been dominant for the last few hundred years largely because it allows instruments with a moderate number of fixed pitch notes to play in any arbitrary key and with each other.
I would love it if in the diagrams of air molecules, they weren't all lined up vertically. This gives a misleading impression. How difficult a change would it be to draw the dots in spatially random positions, but such that the _density_, not the the positions form vertical bands?
E.g. Like this: https://qph.ec.quoracdn.net/main-qimg-e041242ac2954be7e84765...
Here's the interactive slides to play with: http://visual-dsp.switchb.org/
Would it be possible to make this available for translation into other languages, as a community project (all hosted in the same place)? This would be awesome for high school physics in any language.
FYI, I think I spotted a tiny mistake:
"Try adjusting the convergence slider to see how the phase of a waveform affects how loud the resulting wave is."
I think this paragraph should say "phase slider"?
I actually did set this up with i18n in the back of my mind; all of the copy lives in 1 file, so I imagine it wouldn't be _too_ much work!
If there are volunteers to copy it into other languages (the only other one I know is French and I wouldn't trust myself to get the details right), I can spend some time working on getting it to support it.
EDIT: Also, not a typo :) I wanted to make sure users try out both sliders in that section, since you get a lot of interesting effects. When the convergence is 100%, you get phase cancellation. When it's 50%, you get some really groovy looking waveforms.
https://www.reddit.com/r/SnapLenses/comments/7xl1n3/animated...
Happy Valentine’s Day
I've been working with React almost exclusively for 2-3 years (I do occasionally experiment with Vue, or work with Backbone). Once you get used to thinking in React, it makes projects like this really easy; the data flow never got complicated, even though I'm not using any other "state management" library (don't believe the "React is just the V in MVC" saying!).
If you're interested in getting started with React, I wrote a "no fluff" blog post: https://hackernoon.com/simple-react-development-in-2017-113b...
My goal with the post was to cut out everything unnecessary, and focus on getting the user to build something with React with as little time/effort as possible. React now comes with an amazing build system that abstracts away all the configuration, but a lot of folks starting out don't know that, and wind up spending a week tinkering with Webpack and Babel and build config, and installing and learning dependencies they don't need.
ugh just use a (i)FFT, dammit.
No matter how you do it, rendering 75 independent waves will take more computation than rendering 2.
The base of the logarithm depends on the radix of the FFT implementation, but in the end it comes out as a constant factor anyway, and for most FFTs out there it's a base in the range of 2…5, so it's at most a factor of about log(5)/log(2) =~= 2.32
Say you're synthezising a waveform of 1024 samples, then the break even between a fast against a direct fourier transform comes it at around 10 channels. For small numbers of channels the direct method is better. Prime example: Quadratur demodulators where you operate on just a single frequency with the real and imaginary parts.
But when you want to do simple additive synthesis, just put your amplitudes and phases at the right places in the spectrum and to a Inverse fourier transform. It's almost always going to beat any other method. Also it's numerically more stable (although the amplitudes in audio synthesis are never going to be so spread out that precision is going to be a problem).
Also, for any folks who immediately scroll down to see it: the hit-counter only loads a few seconds after the page initializes. This was done intentionally to avoid adding yet another thing to the busy period of initial mount. It means visits of less than a few seconds aren't counted, but -shrugs-.
Sorry it bugged you! I learned when showing this to people that not everyone focuses their eyes on the same part of the screen, and so the focusing thing might not align to where you like to read.
I needed some way to make it clear which "step" the user is on, since the stuff the waveform does changes from step to step.
Open to suggestions for future audio things I do if you have ideas for how to align them without faded text!
On a pedagogic level I also love how it builds up too
Well done!
tl;dr: fiddle with knobs to modulate linear sound.
This is great in principle! Computer music fueled my understanding of signals; Just as drawing is instrumental to understanding linear algebra. Even, the two are isomorphic upto dimension, Einsteinian relativity, etc..
In the bit with the air molecule grid, the areas where the molecules are clustered together are high-pressure, while the areas with large spaces between them are low. This is caused by the staggered nature of the displacement vibrations.
(I'm sure there's a more sophisticated way to explain this, but that's as I understand it)
Merriam-Webster corroborates this:
> the property of a sound and especially a musical tone that is determined by the frequency of the waves producing it : highness or lowness of sound
Wiktionary as well:
> The perceived frequency of a sound or note.
Oxford:
> The quality of a sound governed by the rate of vibrations producing it; the degree of highness or lowness of a tone.
However, IIRC, this simple relationship between frequency of the fundamental and pitch to the ear does not hold well for all possible periodic sounds.
I think the claim that pitch is a partial function of loudness is about perception. If pitch is defined as the 'percieved' frequency, then it includes whatever synthesis of sensory data the brain uses.
The most obvious, is a comparison to concurrent or recently heard sounds. A b-flat preceeded by a c really does sound different than one preceeded by a g. (At least, it really does for me).
Edit: But my understanding of pitch has also, always been pitch = frequency.
At least for pure tones that aren't too high, most listeners perceive a pitch drop at higher intensities.
Both in the Journal of the Acoustical Society of America:
S.S. Stevens, "The relation of pitch to intensity", Vol. 6, 1935, pp. 150-154. http://asa.scitation.org/doi/10.1121/1.1915715
W.B. Snow, "Changes of pitch with loudness at low frequencies", Vol. 8, 1936, pp. 14-19. http://asa.scitation.org/doi/10.1121/1.1915846
It is a) patronising and b) super annoying.