As was discussed on the premiere in the chat, minutephysics has a video explaining 2^1/12 in the Semitones -> Hz formula: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-1Hqm0dYKUx4.html Thanks Jagholin for bringing it up! Now I understand that black box! :)
46:51 he almost let his plan slip with that laugh when he heard it and wondered probably if you can already recognize it, the mad lad is a coding Meme Legend
That attack-decay-sustain-release thing could be implemented very elegantly with simplexes or splines. As they form interesting algebras, I think Haskell would have very nice representations of that.
Never really saw Haskell before, but the way you explain it... My God, I think I'm into Haskell now You've done a great job! It was entertaining and to some extend even useful to a person who never touched that language before Kudos from a fellow programmer and a musician
i had to learn haskell for school so thats why i guess this is in my recommended. man this language is so over my head, watching this brought back bad memories of spending 5 hours to write 5 lines of code lol.
i've gotten myself into this weird situation where i'd put on your videos as i go to bed and now hearing your voice is the only thing that effectively knocks me out
You, sir, are an excellent explainer. Really, not many youtuber programmers have your ability to explain, let alone the knowledge of Haskell. Again, excellent content.
Attack, decay, sustain, and release are used as they can help to emulate sounds of many instruments more accurately and pleasantly. For example, some instruments have a very strong “front” or attack, that decays quickly, whereas others have a weak attack but sustain for a bit then decay.
Переписываю, значит, я тут второй день свой синт с плюсов на раст. Подумываю в процессе как бы это на хаскеле выглядело. А чувак такой: «ща покажу». На следующий день после того как я вообще этот канал обнаружил. Что это? Телепатия? Отсутствие приватности? Магия?
Да, со мной происходило подобное. Мне близко объяснение такого явления тем, что у людей с похожими интересами и занятиями рождаются +/- одни и те же идеи. Ну, а получить соответствующее видео к просмотру - вопрос времени. Есть история одного писателя-фантаста, который изо всех сил торопился выпустить свой роман. Потому что по его убеждению в то самое время другие ~двадцать человек обыгрывали ту же самую идею в своих произведениях. Вопрос был в том, кому удастся высказаться первым. В то же время публично эта идея не обсуждалась, и было это в доинтернетную эпоху. Но идеи-то витают: кто-то где-то обмолвился, кто-то что-то подумал, - и вот оказывается, таких больше одного.
Nice educational and entertaining video (not many people can pull off both aspects), good job. Even though I knew everything on the Haskell front, I learned a lot about music :D.
Argh!! Thank you. I knew I definitely knew the song but I could not find it for the life of me. First comment I found that actually mentioned the name 🙏
the reason why a is 2 ^ 1/12 is because an octave has 12 notes, (i think it's kind of made to be like that, because of the chromatic scale and things) so if we multiply the standard pitch with that 12 times: (2 ^ 1/12) ^ 12 = 2 we get 2, and that's because the ratio of one octave to the next is 1/2. if the process start again multiplying the last frequency we got, times 2 ^ 1/12 that will be in the next octave. our ears perceives pitches with double the frequency as one octave above :) source: www.simplifyingtheory.com/mathematics-and-music/
Thank you a lot for this cool tutorial. It was so fun following around and even I just started programming in Haskell I could learn a lot about Haskell AND music :D Keep on going!
Sum and scale the pulses. Anonther thing that is needed is symbols for notes and symbols for periods (full, half, quater, eighth and so forth). And not to forget abour doted notes. Probably more useful to parse the abc format.
That was amazing. Thanks for sharing your knowledge. Just a few small things: * In case you didn't know: The function *void* will turn the type of any Functor into (). * Haskell is the only language that does not support implicit conversion. This is actually a good thing because it avoids a lot of nasty bugs and forces you to think about the meaning of the expressions you want to write. Converting an Integer to any other type that is an instance of Num is the easiest thing. Just use the fromInteger function. * Your pronounciation of *beats* sounds like *bits*. The i in beats is long. * Also, the last part could have used some more abstraction. :P
I've been following through this tutorial. FYI: the pitch standard tone seems slightly sharp in Tsoding's RU-vid video, but when you compare against the Wikipedia 440hz tone ( en.wikipedia.org/wiki/File:Sine_wave_440.ogg ), it sounds identical :)
I don't know Haskell, but it looks beautiful.. it is like a completely alien language. I wonder how would this code look e.g. in C, could you do a video where you compare Haskell programs with their equivalents in conventional langages?
I have a question. I am making my independent research in the domain. I find some information useful for me in the video. My project code is published under MIT licence but does not use the code from the video. May I use some ideas (e. g. Float type etc.) in the project with credits to the authors of the video and still with the same license?
Great video, if you want to explore this topic more you can do videos on different types of waves like sawtooth and square, and maybe on distortions and effects like that
I would find great to have better tooling for Haskell. For example, an Haskell compiler that can be easily ported to any system (it's painful to port it on new systems…), a compiler which can easily compile statically (even itself), etc.
How is it possible that printf takes a variable number of arguments depending on the number of %s, %f etc?? I didn't think this would be possible with Haskell's type system
The answer is type classes. You can define instances for function types. This works so well because functions are always curried. If you're interested take a look at the QuickCheck package. As long as each parameter type of a function has an *Arbitrary* instance there is an instance that allows to test arbitrary functions.
He answered what song he was marking before people even asked the question what a mad lad coder to think that far ahead because what the only answer on RU-vid comments when someone ask “hey what’s that song called” The only answer is “Darude sandstorm”