Kontroler Midi - sf2

0

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.

  1. Nutek tutaj dużo nie widzę, rozumiem że będę musiał je odtwarzać z róźnym próbkowaniem, aby otrzymać inne oktawy?
  2. 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 i endLoop, tylko pytanie ile razy maksymalnie powtórzyć(jakiś limit musi być)?
    Analizuję format sf2, takie rzeczy powinny być wypisane, ale chyba mam kiepską dokumentacje :(
0

Nutek tutaj dużo nie widzę, rozumiem że będę musiał je odtwarzać z róźnym próbkowaniem, aby otrzymać inne oktawy?

Tak, ale to jest opisane gdzieś wewnątrz .sf2 które sample odpowiadają za jaki zakres nut (bo może być więcej niż jeden sampel do danej nuty - grać będą jednocześnie) i jaka nuta jest bazową dla konkretnego sampla (rawa).
Odgrywając nutę powinieneś wziąć też pod uwagę jej domyślnie skonfigurowaną głośność, panning itp.

Czy muszę zgadywać jak szybko go wyciszać itp?
Z tego co pamiętam sf2 również przechowuje tego typu parametry, ponadto sam strumień MIDI też ma pod tym względem spore możliwości.

Oryginalny edytor banków SF2 Creative'a nazywał się Vienna. Może go znajdziesz. Jak przejrzysz możliwości programu to będziesz wiedział jakie informacje plik sf2 przechowuje.

0

@Azarien o to mi właśnie chodziło, dziękuję Ci bardzo :)

Zapewne program Vienna będzie dość starym programem na Windowsa (będę go próbował odpalić na winie), jest może coś na linucha?
Przeszukałem już dość programów, np. KMidimon dość ułatwił mi sprawdzenie czy sam poprawnie czytam pliki midi.

Chętnie przyjmę jakiekolwiek skrawki informacji na temat sf2, nigdy nie miałem styczności z keyboardami i troszkę trudno porusza mi się po tym temacie.

Najpierw zrobię odtwarzacz plików midi, następnie będę brał się za zrobienie klawiszy do RPI i zrobienie własnego keyboarda bazując na plikach sf2.

0

Ten dokument wydaje mi się kompletny, choć może „trudny w odbiorze”:

http://freepats.zenvoid.org/sf2/sfspec24.pdf

Zapewne program Vienna będzie dość starym programem na Windowsa

Nie martwiłbym się o starość, a raczej o to, że może wymagać oryginalnego SoundBlastera (AWE/Live/Audigy/X-Fi).

jest może coś na linucha?

Wikipedia podaje kilka nazw programów.

0

Tak, też na tym bazuję i jest faktycznie dziwacznie napisany.
Siedzę i przepisuję ten dokument do innej formy, żeby coś zrozumieć.


INFO:     // Supplemental Information
	ifil  // Refers to the version of the Sound Font RIFF file
	isng  // target Sound Engine
	INAM  // Sound Font Bank Name
	ISFT  // SoundFont tools used to create and alter the bank

sdta:     // The Sample Binary Data
	sampl // The Digital Audio Samples for the upper 16 bits

pdta:     // The Preset, Instrument, and Sample Header data
	phdr  // Preset Headers
		achPresetName[20] // name of the preset
		wPreset 
		wBank
		wPresetBagNdx // is an index to the preset's zone list in the PBAG
		dwLibrary
		dwGenre
		dwMorphology

	pbag  // Preset Index list
		wGenNdx
		wModNdx

	pmod  // Preset Modulator list
		sfModSrcOper
		sfModDestOper
		modAmount
		sfModAmtSrcOper
		sfModTransOper

	pgen  // Preset Generator list
		sfGenOper
		genAmount

	inst  // The Instrument Names and Indices
		achInstName
		wInstBagNdx

	ibag  // The Instrument Index list
		wInstGenNdx
		wInstModNdx

	imod  // The Instrument Modulator list
		sfModSrcOper
		sfModDestOper
		modAmount
		sfModAmtSrcOper
		sfModTransOper

	igen  // The Instrument Generator List
		sfGenOper
		genAmount

	shdr  // The Sample Headers
		achSampleName[20]
		dwStart
		dwEnd
		dwStartLoop
		dwEndLoop
		dwSampleRate
		byOriginalKey
		chCorrection
		wSampleLink
		sfSampleType


Nie ukrywam, że mam problem zrozumieć wPreset wBank - rozumiem że jest to rozbite, tak jak to zawsze się rozbijało jak nie było miejsca :)
Ale jak to się wykorzystuje? Hmm... Może jak przeczytam jeszcze 5x to coś znajdę.

0

Ale jak to się wykorzystuje?

Pobaw się którym z programów do edycji, to będziesz miał większe rozeznanie co do czego służy. Ja się w strukturę .sf2 nigdy nie zagłębiałem, ale wiem mniej-więcej jakie ma możliwości bo się „bawiłem w to kiedyś”.

0

Napiszę tak: hehe :]
Program Polyphone jest świetny :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1