Cześć!
Zrobiłem klasę która elegancko wczytuje plik *.sf2 (SoundFont2).
Żeby mieć kontrolę nad wszystkim i oczywiście żeby wszystko zrozumieć, projekt rozbiłem na mniejsze:
- Program rozbijający dany instrument z pliku *.sf2 na pliki *.raw
- Program wczytujący pliki *.raw i sprawdzając wciśnięte klawisze, gra.
Jak to wszystko się uda, oczywiście pominę rozbijanie pliku *.sf2 - póki co wole mieć mniejsze programiki i skupić się na odtwarzaniu nut.
Pierwszym programem rozbiłem plik ct8mgm.sf2 (tylko dla "Piano") na poszczególne rawy z próbkowaniem 44100 i formatem 16bitowym:
PianoA0.raw PianoAb3.raw PianoC#2.raw PianoC6.raw PianoDb3.raw PianoE0.raw PianoGb4.raw
PianoAb2.raw PianoAb5.raw PianoC5.raw PianoD1.raw PianoDb4.raw PianoGb1.raw PianoGb5.raw
Ścieżki dźwiękowe są powycinane na podstawie wpisu shdr
przykład:
sampleName "Piano E0 R"
start 0
end 36712
startLoop 24976
endLoop 36704
sampleRate 44100
originalPitch 60
pitchCorrection 0
sampleLink 65535
sampleType 1
Pojawiło mi się teraz kilka pytań, może ktoś z Was coś gra, albo miał styczność z kontrolerami Midi.
- Nutek tutaj dużo nie widzę, rozumiem że będę musiał je odtwarzać z róźnym próbkowaniem, aby otrzymać inne oktawy?
- Jak to jest z długością odtwarzania nuty? Wiadomo, że gdy puści się klawisz na pianinie ten szybciej się wycisza, jest jakiś standard jak to robić? Czy muszę zgadywać jak szybko go wyciszać itp? Czy może odtwarzać go tak długo jak trwa, a jeśli klawisz jest wciśnięty, to wykorzystać
startLoop
iendLoop
, tylko pytanie ile razy maksymalnie powtórzyć(jakiś limit musi być)?
Analizuję format sf2, takie rzeczy powinny być wypisane, ale chyba mam kiepską dokumentacje :(