mix() blends in the sRGB values you see in a hex string. interpolate() converts to
linear light first, blends there, and converts back. Halfway between black and white,
mix() gives #808080 and interpolate() gives #BCBCBC — a difference of 60 in every
channel, which is why the two strips below do not line up.
Ly8gPGJsb2NrOmNvbmZpZzowPgpjb25zdCBjb25maWcgPSB7CiAgZnJvbTogJ2JsYWNrJywKICB0bzogJ3doaXRlJywKICBzdGVwczogOSwKICByZW5kZXI6ICh7IGZyb20sIHRvLCBzdGVwcyB9KSA9PiB7CiAgICBjb25zdCBhID0gbmV3IGNvbG9yLkNvbG9yKGZyb20pCiAgICBjb25zdCBiID0gbmV3IGNvbG9yLkNvbG9yKHRvKQogICAgY29uc3QgbWl4ZWQgPSBbXQogICAgY29uc3QgaW50ZXJwb2xhdGVkID0gW10KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHM7IGkrKykgewogICAgICBjb25zdCB0ID0gaSAvIChzdGVwcyAtIDEpCiAgICAgIG1peGVkLnB1c2goYS5jbG9uZSgpLm1peChiLCAxIC0gdCkuaGV4U3RyaW5nKCkpCiAgICAgIGludGVycG9sYXRlZC5wdXNoKGEuY2xvbmUoKS5pbnRlcnBvbGF0ZShiLCB0KS5oZXhTdHJpbmcoKSkKICAgIH0KICAgIHJldHVybiBbCiAgICAgIHsgbGFiZWw6ICdtaXgoKScsIHN3YXRjaGVzOiBtaXhlZCB9LAogICAgICB7IGxhYmVsOiAnaW50ZXJwb2xhdGUoKScsIHN3YXRjaGVzOiBpbnRlcnBvbGF0ZWQgfSwKICAgIF0KICB9LAp9Ci8vIDwvYmxvY2s6Y29uZmlnPgoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgY29uZmlnLAogIGNob2ljZXM6IFsKICAgIHsgcGF0aDogJ2Zyb20nLCB2YWx1ZXM6IFsnYmxhY2snLCAncmVkJywgJ25hdnknLCAnIzAwNDQwMCddLCBjb250cm9sOiAncmFkaW8nLCBsYWJlbDogJ0Zyb20nIH0sCiAgICB7IHBhdGg6ICd0bycsIHZhbHVlczogWyd3aGl0ZScsICdsaW1lJywgJ29yYW5nZScsICcjZmZjYzAwJ10sIGNvbnRyb2w6ICdyYWRpbycsIGxhYmVsOiAnVG8nIH0sCiAgXSwKfQ==