static GameObject[] ExtractVenuePropAnimsFromMidi(MidiFile mf) { var objs = new List <GameObject>(); short index = 1; var editorCom = new Component { Rev = 3, Name1 = "Editor", Name2 = "Editor", Unknown2 = 2, Props = new[] { new Property("capabilities", new UIntValue(62)) } }; objs.Add(new GameObject { Id = new GameObjectId { Index = 0, Layer = 0 }, Rev = 2, Name = "root", Components = new[] { editorComponent, entityHeaderComponent, new Component { Rev = 3, Name1 = "PropAnim", Name2 = "PropAnim", Unknown2 = 0, Props = StructValue.FromData( StructType.FromData(DTX.FromDtaString( @"(props (frame_range_start float) (frame_range_end float) (time_units int) (is_looping bool))")), DTX.FromDtaString( @"(frame_range_start 3.402823E+38) (frame_range_end -3.402823E+38) (time_units 0) (is_looping 0)")).Props } } }); void AddAnimTrack(StructValue props) { objs.Add(new GameObject { Id = new GameObjectId { Index = index, Layer = index++ }, Rev = 2, Name = "Keys type 11", Components = new[] { editorCom, new Component { Rev = 3, Name1 = "PropKeysSymCom", Name2 = "PropKeys", Unknown2 = 0, Props = props.Props } } }); } foreach (var kv in ExtractPlayerIntensities(mf)) { AddAnimTrack(MakeAnimProps(kv.Key, kv.Value)); } foreach (var kv in ExtractVenueAnims(mf)) { AddAnimTrack(MakeAnimProps(kv.Key, kv.Value)); } return(objs.ToArray()); }