Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Muzyka w C++ - jaki beep?

Ostatnio zmodyfikowano 2015-11-28 18:51
Autor Wiadomość
Lich555
Temat założony przez niniejszego użytkownika
Muzyka w C++ - jaki beep?
» 2015-11-26 16:32:30
Witam.
Bawię się ostatnio muzyką w C++ i zastanawiam się, skąd ludzie wiedzą, co wpisać w beep (co tutaj wpisać?)? Głównie chodzi mi pierwszą liczbę. Jak ludzie robią np. muzykę z Mario? Nie chcę mi się wierzyć, że wpisują tam liczby "na słucha". beep(300, 100) jest za niskie, to dajmy beep(350, 100). Myślę, że jest jakaś lepsza metoda na to :P
P-140838
Monika90
» 2015-11-26 16:52:06
Jeżeli wiesz jakie to mają być wysokości dźwięków, to możesz obliczyć częstotliwość w hercach na podstawie numeru nuty.
Np. niech C środkowe ma numer 60 (C# = 61, D = 62, itd. jak w MIDI), to wtedy częstotliwość f dla nuty n wynosi
f = 440 * 2(n - 69)/12 Hz
P-140840
pekfos
» 2015-11-26 17:20:15
Nie chcę mi się wierzyć, że wpisują tam liczby "na słucha". beep(300, 100) jest za niskie, to dajmy beep(350, 100).
Skąd w ogóle założenie, że wpisują tam stałe?
P-140841
Lich555
Temat założony przez niniejszego użytkownika
» 2015-11-27 15:40:23
@Monika90
Szczerze to niezbyt zrozumiałem Twój post :P
Dla przykładu, masz taką muzyczkę: https://www.youtube.com/watch?v=cgiqduwHrI0 Da się ją jakoś odwzorować w C++? Tzn. wiem, że się da (niedokładnie, ale wiadomo o co chodzi), tylko właśnie jak to zrobić? :P

@pekfos
Masz rację, choć napisałem tak raczej dla przykładu.
P-140913
Monika90
» 2015-11-27 18:06:34
Ze słuchu

#include <windows.h>
#include <cmath>

struct Note
{
    float duration;
    float pitch;
};

double frequency(double note)
{
    return 440 * std::pow(2., (note - 69) / 12.);
}

auto bpm(double tempo)
{
    return [tempo](double duration) -> unsigned { return 240'000 / tempo * duration + 0.5; };
}

int main()
{
    const Note notes[] =
    {
        {1/16., 64},
        {1/16., 60},
        {1/16.},
        {1/16., 55},

        {2/16.},
        {1/16., 55.5},
        {1/16.},

        {1/16., 57},
        {1/16., 65},
        {1/16.},
        {1/16., 65},

        {1/16., 57},
        {3/16.},


        {1/12., 59},
        {1/12., 69},
        {1/12., 69},

        {1/12., 69},
        {1/12., 67},
        {1/12., 65},

        {1/16., 64},
        {1/16., 60},
        {1/16.},
        {1/16., 57},

        {1/16., 55},
        {3/16.},


        {1/16., 64},
        {1/16., 60},
        {1/16.},
        {1/16., 55},

        {2/16.},
        {1/16., 55.5},
        {1/16.},

        {1/16., 57},
        {1/16., 65},
        {1/16.},
        {1/16., 65},

        {1/16., 57},
        {3/16.},


        {1/16., 59},
        {1/16., 65},
        {1/16.},
        {1/16., 65},

        {1/12., 65},
        {1/12., 64},
        {1/12., 62},

        {1/16., 60},
        {1/16., 55},
        {1/16.},
        {1/16., 52},

        {1/16., 48},
        {3/16.},
    };

    const auto time = bpm(96);
    const int transpose = 12;
    for (auto& note : notes)
        if (note.pitch)
            Beep(frequency(note.pitch + transpose) + 0.5, time(note.duration));
        else
            Sleep(time(note.duration));
}

P-140920
pekfos
» 2015-11-27 19:24:51
Masz rację, choć napisałem tak raczej dla przykładu.
A co to zmienia? Pytasz, skąd ludzie wiedzą, jaką dać częstotliwość. Spytaj kompozytora, skąd wie, jakie dźwięki ze sobą składać, by otrzymać daną melodię. Od technicznej strony, to dane z zapisanymi częstotliwościami. Do komponowania muzyki to nie jest praktyczne podejście. W muzyce jest powszechnie stosowany inny system, a przeliczenie jednego na drugi jest proste i jest wykonywane przez odpowiednie narzędzia. Niczego nie trzeba robić 'na słucha', jeśli ma się zapis nutowy, a to najczęstszy przypadek.
P-140934
Monika90
» 2015-11-27 21:54:32
Mój kod powyżej został poprawiony, dodałam możliwość odtwarzania mikrotonów (bo ta muzyka zawiera ćwierćtony) i określanie tempa w uderzeniach na minutę (BPM).
P-140962
Lich555
Temat założony przez niniejszego użytkownika
» 2015-11-27 22:39:38
@Monika90 Mogłabyś dać jakiś link, gdzie wyjaśnione są pojęcia, które użyłaś w swoim pierwszym poście? Mam na myśli C# = 61, D = 62, itp. Jest to dla mnie kompletnie czarna magia, a chciałbym się lepiej z tym zapoznać.
P-140963
« 1 » 2
  Strona 1 z 2 Następna strona