Plik multimediów (mmd): Różnice pomiędzy wersjami
(→Sekcja internaldata) |
(→Sekcja internaldata) |
||
Linia 339: | Linia 339: | ||
|- | |- | ||
|dooropen ||string ||Nazwa pliku ||Dźwięk Otwieranie drzwi | |dooropen ||string ||Nazwa pliku ||Dźwięk Otwieranie drzwi | ||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
|couplerstretch ||string ||Nazwa pliku ||Dźwięk naciągania sprzęgu | |couplerstretch ||string ||Nazwa pliku ||Dźwięk naciągania sprzęgu |
Wersja z 19:34, 8 paź 2017
Spis treści
Funkcje czytające
Sekcje models i sounds oraz definicje kabin są czytane w TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,AnsiString ReplacableSkin)
Sekcja internaldata oprócz definicji kabin czytana jest w TTrain::LoadMMediaFile(AnsiString asFileName)
Definicja kabin czytana jst w TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
Sekcja models
Kończy się słowem endmodels
Własność | Parametry po typie | Opis | Uwagi |
---|---|---|---|
models | string | Nazwa pliku modelu *.t3d | Jeśli na końcu nazwy znajduje się # to ma więcej wymiennych tekstur definiowanych we wpisie w scenerii |
animations | Spis kończy się wartością -1 po ostatniej definicji liczby animacji. Wartości w kolejności wpisanej do tabelki | ||
int | Liczba osi | ||
int | Liczba drzwi | ||
int | Liczba wahaczy (rot) | ||
int | Liczba zderzaków (mov) | ||
int | Liczba wózków | ||
int | Liczba pantografów | ||
int | Liczba wiązarów | ||
lowpolyinterior | string | Nazwa pliku modelu uproszczonej kabiny | |
brakemode | string | Gałka nastawy hamulca | |
loadmode | string | Gałka nastawy ładowny / próżny | |
animwheelprefix | string | Prefix dla wszystkich kręcących się kół | Do nazwy będą dodawane kolejne cyfry w liczbie podanej w animations |
animpantprefix | string | Porzucone | |
Animpantrd1prefix | string | Nazwa ramienia dolnego pantografów 1 | Do nazwy będą dodawane kolejne cyfry w liczbie podanej w animations |
Animpantrd2prefix | string | Nazwa ramienia dolnego pantografów 2 | Do nazwy będą dodawane kolejne cyfry w liczbie podanej w animations |
Animpantrg1prefix | string | Nazwa ramienia górnego pantografów 1 | Do nazwy będą dodawane kolejne cyfry w liczbie podanej w animations |
Animpantrg2prefix | string | Nazwa ramienia górnego pantografów 2 | Do nazwy będą dodawane kolejne cyfry w liczbie podanej w animations |
animpantslprefix | string | Nazwa ślizgaczy | Do nazwy będą dodawane kolejne cyfry w liczbie podanej w animations |
pantfactors | Float | Pozycja w osi x pantografów 1 | |
Float | Pozycja w osi x pantografów 2 | ||
Float | Wysokość ślizgacza pantografów 1 | ||
float | Wysokość ślizgacza pantografów 2 | ||
animpistonprefix | string | Nazwa tłoków w cylindrach | Nie używane |
animconrodprefix | string | Nazwa korbowodów | Nie używane |
pistonfactors | Parametry napędu | Nie używane | |
animreturnprefix | string | Nazwa drążka mimośrodowego | Nie używane |
animexplinkprefix | String | Nazwa jarzma | Nie używane |
animpendulumprefix | string | Nazwa wahaczy | |
pendulumamplitude | float | Amplituda drgań | Wymagane jeśli animpendulumprefix |
engineer | string | Nazwa modelu mechanika | Porzucone |
animdoorprefix | string | Nazwa drzwi |
Jeśli wykryje typ dt_EZT to automatycznie ładowany jest model z pliku przedsionki.t3d. Trzeba to zmienić na wpis żeby mógł sobie wybrać ten model sam, albo najlepiej usunąć i definiować w samym modelu.
Sekcja sounds
Kończy się słowem endsounds
Własność | Parametry po typie | Opis | Uwagi |
---|---|---|---|
wheel_clatter | float | Tłumienie dźwięku | |
float | Pozycja osi w stosunku do środka pojazdu | Pozycje powtarzające się tyle razy ile jest osi, na końcu słowo end | |
string | Nazwa dźwięku | ||
engine | string | Nazwa dźwięku silnika | |
float | Tłumienie dźwięku | ||
float | Mnożnik amplitudy | ||
float | Offset amplitudy | ||
float | Mnożnik częstotliwości | Dla diesla normalizacja: am/(pwr+nmax) | |
float | Offset częstotliwości | ||
ventilator | string | Nazwa dźwięku wentylatorów | |
float | Tłumienie dźwięku | ||
float | Mnożnik amplitudy | normalizacja: am/rVentnmax | |
float | Offset amplitudy | ||
float | Mnożnik częstotliwości | normalizacja: fm/rVentnmax | |
float | Offset częstotliwości | ||
transmission | string | Nazwa dźwięku przekładni | |
float | Tłumienie dźwięku | ||
brake | string | Nazwa dźwięku pisku hamulca | |
float | Tłumienie dźwięku | ||
float | Mnożnik amplitudy | ||
float | Offset amplitudy | ||
brakeacc | string | plik z przyspieszaczem (upust po zlapaniu hamowania) | |
unbrake | string | Plik z końcem hamowania | |
float | Tłumienie dźwięku | ||
derail | string | Plik z dźwiękiem wykolejenia | |
float | Tłumienie dźwięku | ||
dieselinc | string | Plik z dźwiękiem wchodzenia na obroty | |
float | Tłumienie dźwięku | ||
curve | string | Plik z dźwiękiem pisków na łukach | |
float | Tłumienie dźwięku | ||
horn1 | string | Dźwięk rozpoczęcia | Syrena niska |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
Horn2 | string | Dźwięk rozpoczęcia | Syrena wysoka |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
departuresignal | string | Dźwięk rozpoczęcia | Sygnał odjazdu / zamykania drzwi |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
pantographup | String | Nazwa dźwięku | Podnoszenie pantografu |
pantographdown | string | Nazwa pliku | Opuszczanie pantografu |
compressor | string | Dźwięk rozpoczęcia | Sprężarka |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
converter | string | Dźwięk rozpoczęcia | Przetwornica |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
turbo | string | Dźwięk rozpoczęcia | Praca turbo |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
small-compressor | string | Dźwięk rozpoczęcia | Sprężarka pomocnicza |
String | Dźwięk trwania | ||
String | Dźwięk zakończenia | ||
float | Odległość tłumienia | ||
dooropen | string | Nazwa dźwięku | Otwieranie drzwi |
doorclose | string | Nazwa dźwięku | Zamykanie drzwi |
Sekcja internaldata
Musi koniecznie być na końcu pliku, gdyż nie ma słowa zakończenia
Własność | Parametry po typie | Opis | Uwagi |
---|---|---|---|
ctrl | string | Nazwa pliku | Dźwięk Nastawnik |
Ctrlscnd | string | Nazwa pliku | Dźwięk Nastawnik bocznikowania |
reverserkey | string | Nazwa pliku | Dźwięk Nastawnik kierunku |
buzzer | string | Nazwa pliku | Dźwięk CA / SHP |
slipalarm | string | Nazwa pliku | Dźwięk Wykrycie poślizgu |
tachoclock | string | Nazwa pliku | Dźwięk Tykanie haslera |
switch | string | Nazwa pliku | Dźwięk Przełączniki |
pneumaticswitch | string | Nazwa pliku | Dźwięk Przełączniku elektropneumatyczne |
wejscie_na_bezoporow | string | Nazwa pliku | Dźwięk Wejście na pozycję bez oporową |
wejscie_na_drugi_uklad | string | Nazwa pliku | Dźwięk Wejście na drugi i trzeci układ |
relay | string | Nazwa pliku | Dźwięk Styczniki. |
pneumaticrelay | string | Nazwa pliku | Dźwięk Styczniki pneumatyczne |
couplerattach | string | Nazwa pliku | Dźwięk Połączenie sprzęgów |
couplerdetach | string | Nazwa pliku | Dźwięk Rozłączenie sprzęgów |
ignition | string | Nazwa pliku | Dźwięk Zapłon silnika |
brakesound | String | Nazwa pliku | Dźwięk Odgłos hamulca |
Float | Mnożnik amplitudy | Normalizacja: am/mbf | |
Float | Offset amplitudy | ||
float | Mnożnik częstotliwości | Normalizacja: fm/Vmax | |
float | Offset częstotliwości | ||
slipperysound | String | Nazwa pliku | Dźwięk Poślizg |
Float | Mnożnik amplitudy | Normalizacja: am/Vmax | |
Float | Offset amplitudy | ||
airsound | String | Nazwa pliku | Dźwięk Syk kranu |
Float | Mnożnik amplitudy | ||
Float | Offset amplitudy | ||
Airsound2 | String | Nazwa pliku | Dźwięk Syk kranu |
Float | Mnożnik amplitudy | ||
Float | Offset amplitudy | ||
Airsound3 | String | Nazwa pliku | Dźwięk Syk kranu |
Float | Mnożnik amplitudy | ||
Float | Offset amplitudy | ||
Airsound4 | String | Nazwa pliku | Dźwięk Syk kranu |
Float | Mnożnik amplitudy | ||
Float | Offset amplitudy | ||
Airsound5 | String | Nazwa pliku | Dźwięk Syk kranu |
Float | Mnożnik amplitudy | ||
Float | Offset amplitudy | ||
fadesound | string | Nazwa pliku | Dźwięk tła |
localbrakesound | String | Nazwa pliku | Dźwięk Kran pomocniczy |
Float | Mnożnik amplitudy | ||
Float | Offset amplitudy | ||
runningnoise | String | Nazwa pliku | Dźwięk Stukot podczas jazdy |
Float | Mnożnik amplitudy | Normalizacja: AM/Vmax | |
Float | Offset amplitudy | ||
float | Mnożnik częstotliwości | Normalizacja: FM/Vmax | |
float | Offset częstotliwości | ||
engageslippery | String | Nazwa pliku | Dźwięk Tarcie sprzęgła |
Float | Mnożnik amplitudy | Normalizacja: fm/nmax | |
Float | Offset amplitudy | ||
float | Mnożnik częstotliwości | ||
float | Offset częstotliwości | ||
mechspring | String | Nazwa pliku | Bujanie kamerą w kabinie |
float | Spring constant | Sprężystość | |
Float | Spring damping | Tłumienie | |
Float | Spring x | Bujanie | |
Float | Spring y | Bujanie | |
Float | Spring z | Bujanie | |
Float | Max spring | ||
Float | Roll | Kiwanie | |
float | Pitch | Kiwanie | |
pantographup | string | Nazwa pliku | Dźwięk Podnoszenie pantografu |
pantographdown | string | Nazwa pliku | Dźwięk Opuszczanie pantografu |
doorclose | string | Nazwa pliku | Dźwięk Zamykanie drzwi |
dooropen | string | Nazwa pliku | Dźwięk Otwieranie drzwi |
couplerstretch | string | Nazwa pliku | Dźwięk naciągania sprzęgu |
bufferclamp | string | Nazwa pliku | Dźwięk odbijania się buforów |
Jeśli wykryje wpis relay to ładuje bez pytania pliki wejscie_na_bezoporow.wav i wejscie_na_drugi_uklad.wav możliwe do nadpisania.
Dźwięki couplerattach.wav, en57_couplerstretch.wav, couplerdetach.wav, en57_bufferclamp.wav są ładowane jako domyślne przy braku deklaracji.
Opis kabin
Cabdeficnition
Po słowie kluczowym cab<x>definition1 gdzie <x> oznacza numer opisywanej kabiny:
Własność | Parametry po typie | Opis | Uwagi |
---|---|---|---|
cablight | float | Ciemny R | Parametr cablitght jest opcjonalny ale koniecznie musi być jako pierwszy parametr po cab(x)definition, inaczej będziemy mieli crash-a |
float | Ciemny G | ||
float | Ciemny B | ||
float | Jasny R | ||
float | Jasny G | ||
float | Jasny B | ||
float | Przyciemniony R | ||
float | Przyciemniony G | ||
float | Przyciemniony B | ||
float | X | W kodzie opisane jako CabPos1, w plikach jako wymiar kabin | |
float | Y | ||
float | Z | ||
float | X | W kodzie opisane jako CabPos2, w plikach jako wymiar kabin | |
float | Y | ||
float | Z | ||
driver1pos | float | X | Pozycja początkowa maszynisty |
float | Y | ||
float | Z | ||
driver1sitpos | float | X | Pozycja siedząca maszynisty. Jeśli nie ma wpisu to przyjmowany jest driver1pos |
float | Y | ||
float | Z | ||
cab1model | string | Nazwa pliku | Model kabiny, może być none |
Gałki, mierniki, krany
Następnie definicja wszelakich gałek, kranów, mierników. Wszystkie elementy mają takie same parametry:
Parametry po typie | Opis | Uwagi |
---|---|---|
string | Nazwa submodelu | |
string | Rodzaj animacji | rot, mov, wip, dgt |
float | Par animacji 1 | Wartość końcowa |
float | Par animacji 2 | Wartość początkowa |
float | Par animacji 3 | Hamowanie przy zbliżaniu się do wartości zadanej |
Dostępne są:
klucz | opis |
---|---|
mainctrl2 | Główny nastawnik |
mainctrlact | Ząbek pozycji aktualnej |
scndctrl | Bocznik |
dirkey | Nastawnik kierunku |
brakectrl | Kran główny |
localbrake | Kran pomocniczy |
manualbrake | Hamulec pomocniczny |
alarmchain | Klapa Ackermana (0 wył 1 zał) |
brakeprofile_sw | Przełącznik tow/osob/posp |
brakeprofileg_sw | Przełącznik tow/osob |
brakeprofiler_sw | Przełącznik osob/posp |
maxcurrent_sw | Rozruch wysoki / niski |
main_off_bt | Wyłączenie (jeśli dwa rożne przyciski) |
main_on_bt | Włączenie (j.w.) |
security_reset_bt | Przycisk czuwaka / SHP |
releaser_bt | Odluźniacz |
antislip_bt | Hamulec przeciwpoślizgowy |
sand_bt | Piasecznica |
horn_bt | Syrena |
fuse_bt | Bezpiecznik nadmiarowy |
converterfuse_bt | Przekaźnik nadmiarowy przetowrnicy i ogrzewania |
stlinoff_bt | Styczniki liniowe |
door_left_sw | Drzwi lewe |
door_right_sw | Drzwi prawe |
departure_signal_bt | Sygnał odjazdu |
upperlight_sw | Światło białe przednie górne |
leftlight_sw | Światło białe przednie lewe |
rightlight_sw | Światło białe przednie prawe |
leftend_sw | Światło czerwone przednie lewe |
rightend_sw | Światło czerwone przednie prawe |
rearupperlight_sw | Światło białe tylne górne |
rearleftlight_sw | Światło białe tylne lewe |
rearrightlight_sw | Światło białe tylne prawe |
rearleftend_sw | Światło czerwone tylne lewe |
rearrightend_sw | Światło czerwone tylne prawe |
dimheadlights_sw | Przyciemnienie reflektorów |
compressor_sw | Sprężarka |
converter_sw | Przetwornica |
converteroff_sw | Wyłącznik przetwornicy |
main_sw | Wyłącznik szybki |
radio_sw | Radio |
pantfront_sw | Pantograf przedni |
pantrear_sw | Pantograf tylni |
pantfrontoff_sw | Pantograf przedni dół |
pantrearoff_sw | Pantograf tylni dół |
pantalloff_sw | Oba pantografy dół |
pantcompressor_sw | Sprężarka zbiornika pantografów |
pantcompressorvalve_sw | Kurek trój drogowy pantografów (Łączenie zbiornika pantografów ze zbiornikiem głównym) |
pantalloff_sw | Pantograf tylni dół |
trainheating_sw | Ogrzewanie składu |
signalling_sw | Sygnalizacja hamowania |
door_signalling_sw | Sygnalizacja blokady drzwi |
nextcurrent_sw | Grzanie składu |
cablight_sw | Oświetlenie kabiny pełne |
cablightdim_sw | Oświetlenie kabiny przyciemnione |
battery_sw | Bateria |
instrumentlight_sw | Podświetlenie mierników |
universal0 | *Tylko na wersji eksperymentalnej od @Tmj. Nie działa na EXE z Paczki.* |
universal1 | |
universal2 | |
universal3 | |
universal4 | |
universal5 | *Tylko na wersji eksperymentalnej od @Tmj. Nie działa na EXE z Paczki.* |
universal6 | *Tylko na wersji eksperymentalnej od @Tmj. Nie działa na EXE z Paczki.* |
universal7 | *Tylko na wersji eksperymentalnej od @Tmj. Nie działa na EXE z Paczki.* |
universal8 | *Tylko na wersji eksperymentalnej od @Tmj. Nie działa na EXE z Paczki.* |
universal9 | *Tylko na wersji eksperymentalnej od @Tmj. Nie działa na EXE z Paczki.* |
tachometer | |
tachometerb | Prędkościomierz z szarpaniem |
tachometern | Prędkościomierz bez szarpania |
tachometerd | Prędkościomierz cyfrowy |
hvcurrent1 | |
hvcurrent1b | Amperomierz 1 |
hvcurrent2 | |
hvcurrent2b | Amperomierz 2 |
hvcurrent3b | |
hvcurrent3b | Amperomierz 3 |
hvcurrent | |
hvcurrentb | Amperomierz sumujący |
brakepress | |
brakepressb | Manometr cylindrów |
pipepress | |
pipepressb | Manometr przewodu głównego |
limpipepress | Manometr zbiornika sterującego zaworu maszynisty |
cntrlpress | Manometr zbiornika rozrządu |
compressor | |
compressorb | Manometr sprężarki / zbiornika głównego |
hvbcurrent1 | Amperomierz 1 drugiego członu |
hvbcurrent2 | Amperomierz 2 drugiego członu |
hvbcurrent3 | Amperomierz 3 drugiego członu |
hvbcurrent | Amperomierz sumujący drugiego członu |
clock4 | Opcjonalnie słowo "analog" Zegarek |
evoltage | Woltomierz silników |
hvoltage | Woltomierz napięcia w sieci |
lvoltage | Woltomierz napięcia za przetwornicą |
enrot1m | Obrotomierz 1 [obr/s] |
enrot2m | Obrotomierz 2 [obr/s] |
enrot3m | Obrotomierz 3 [obr/s] |
engageratio | Ciśnienie sterownika sprzęgła [część docisku maksymalnego 0-1] |
maingearstatus | Ciśnienie sterownika skrzyni biegów [część docisku maksymalnego 0-1] |
ignitionkey | Włącznik zapłonu |
distcounter | Licznik kilometrów |
Od niedawna, na wersji eksperymentalnej EXE od @Tmj, można przypisać więcej dźwięków do przełączników oraz kontrolek. Nowa składnia wygląda następująco:
mainctrl: { nastawnikpodst rot -0.02 0.0 0.15 soundinc: nastawnikdoprzodu.wav, sounddec: nastawnikdotylu.wav, sound17: nastawnikpozycja17.wav }
parametry dźwięku podawane sa w formacie klucz: nazwadzwieku.wav
rozpoznawane klucze to:
- soundinc: dźwięk odgrywany gdy urządzenie przestawiane jest na pozycje 'nastepna' czyli np przestawienie nastawnika do przodu, załączenie przycisku, otwarcie szafki, załączenie kontrolki itp<
- sounddec: dźwięk odgrywany gdy urządzenie przestawiane jest na pozycje 'poprzednia' czyli np przestawienie nastawnika do tylu, puszczenie grzyba, zamkniecie okna, wyłączenie kontrolki itp.
- soundX: dźwięk odgrywany gdy urządzenie ustawione jest na konkretna pozycje X większość przycisków ma tylko dwie pozycje, "0" i "1" ale np nastawniki maja tyle pozycji, ile pozycji ma nastawnik. Ilość wpisów soundX dla danego elementu jest w zasadzie dowolna. NIE działa dla kontrolek, tylko dla przełączników!!!
Lampki
string Nazwa submodelu lampki
- i-maxft5 Maksymalna siła pociągowa
- i-maxftt Przekroczenie maksymalnej siły pociągowej
- i-radio Radio
- i-manual_brake Działanie hamulca ręcznego
- i-door_blocked Blokada drzwi
- i-slippery Sygnalizacja poślizgu
- i-contactors Działanie styczników liniowych
- i-conv_ovld Zadziałanie przekaźnika nadmiarowego przetwornicy
- i-converter Działanie przetwornicy
- i-diff_relay Zadziałanie przekaźnika różnicowo-prądowego
- i-diff_relay2 Zadziałanie przekaźnika różnicowo-prądowego pomocniczego
- i-motor_ovld Zadziałanie przekaźnika nadmiarowego silników
- i-train_controll Tabor w ukrotnieniu
- i-brake_delay_r Hamulec ustawiony na pospieszny
- i-mainbreaker Zadziałanie wyłącznika szybkiego
- i-vent_ovld Zadziałanie przekaźnika nadmiarowego wentylatorów
- i-comp_ovld Przekaźnik nadmiarowy sprężarki
- i-resistors Jazda na oporach
- i-no_resistors Jazda bez oporów
- i-no_resistors_b Jazda bez oporów B
- i-highcurrent Ustawiony wysoki rozruch
- i-universal3 Podłączenie do przycisku uniwersal3
- i-universal3_M Uniwersal3 działa tylko na włączonym układzie głownym
- i-universal3_C Uniwersal3 działa tylko przy włączonej przetwornicy
- i-vent_trim Żaluzje silników
- i-trainheating Ogrzewanie składu
- i-security_aware Lampka czuwaka
- i-security_cabsignal Lampka SHP
- i-door_left Otwarte drzwi lewe
- i-door_right Otwarte drzwi prawe
- i-departure_signal Działanie sygnału odjazdu
- i-reserve Rezerwa
- i-scnd Lampka działania boczników
- i-scnd1 Bocznik 1
- i-scnd2 Bocznik 2
- i-scnd3 Bocznik 3
- i-scnd4 Bocznik 4
- i-braking Hamowanie (hamienie)
- i-braking-ezt Hamowanie zespolone
- i-braking-ezt2 Hamowanie zespolone 2
- i-compressor Działanie sprężarki
- i-compressorb Sprężarka pomocnicza
- i-voltbrake Lampka napięcia nastawy hamulca
- i-mainbreakerb Wyłącznik szybki B
- i-resistorsb Jazda na oporach B
- i-contactorsb Styczniki liniowe B
- i-conv_ovldb Przekaźnik nadmiarowy przetwornicy B
- i-converterb Przetwornica B
- i-forward Jazda do przodu
- i-backward Jazda do tyłu
- i-cablight Oświetlenie kabiny
- i-dynamicbrake Działanie hamulca elektrodynamicznego
- i-instrumentlight Podświetlenie mierników
1. cab1definition tak naprawdę jest cab(x)definition wraz z wszystkimi potomnymi. Kabiny dostępne od 0 do 2, przy czym 0 jest korytarzem a 1 i 2 kabinami odpowiednio A (headdriver) i B (reardriver). 2. od mainctrl do distcounter wszystkie pozostałe parametry są te same. Podane tylko w mainctrl a w reszcie tylko jako odnośniki do poszczególnych gałek 3. Rodzaje animacji: rot (domyślny), mov, wip, dgt 4. Po słowie kluczowym analog są ładowane submodele z modelu kabiny o nazwach: ClockShand ClockMhand ClockHhand odpowiednio dla ramion sekund, minut i godzin 5. Dla lampek do nazwy submodelu dodawane są słowa "_on" i "_off" dla stanu zapalonego i zgaszonego.
Uwagi
W specyfikacji znajdują się wszystkie jawnie zdefiniowane przełączniki, przyciski i lampki. Nie ma tutaj żadnych danych na podstawie, których można robić ekrany LCD. Te dane znajdują się w osobnym pliku.