// ------------------------------------------------------ // Save the data to a pattern file void Save_Pattern_Data(int (*Write_Function)(void *, int ,int, FILE *), int (*Write_Function_Swap)(void *, int ,int, FILE *), FILE *in) { int Cur_Position = Get_Song_Position(); int Old_Curr_Buff_Block = Curr_Buff_Block; Copy_Buff(NBR_COPY_BLOCKS - 1, Curr_Buff_Block); Curr_Buff_Block = NBR_COPY_BLOCKS - 1; Copy_Selection_To_Buffer(Cur_Position); Calc_selection(); Write_Function(Buff_MultiNotes[Curr_Buff_Block], sizeof(char), MAX_TRACKS, in); Write_Function(Buff_Effects[Curr_Buff_Block], sizeof(char), MAX_TRACKS, in); Write_Function_Swap(&b_buff_xsize[Curr_Buff_Block], sizeof(int), 1, in); Write_Function_Swap(&b_buff_ysize[Curr_Buff_Block], sizeof(int), 1, in); Write_Function_Swap(&start_buff_nibble[Curr_Buff_Block], sizeof(int), 1, in); int Block_Len = PATTERN_LEN; unsigned char *Final_Mem_Out = Pack_Data(BuffBlock[Curr_Buff_Block], &Block_Len); if(Final_Mem_Out) { Write_Function_Swap(&Block_Len, sizeof(int), 1, in); Write_Function(Final_Mem_Out, sizeof(char), Block_Len, in); free(Final_Mem_Out); } Curr_Buff_Block = Old_Curr_Buff_Block; Actupated(0); }
// ------------------------------------------------------ // Set pattern row (EDIT) void Midi_Edit_Set_Row(int Data) { if(!is_recording && !Songplaying) { int Pos = Get_Song_Position(); int Rows = patternLines[pSequence[Pos]]; float factor = ((float) Rows / 127.0f); Pattern_Line = (int) (Data * factor); if(Pattern_Line < 0) Pattern_Line = 0; if(Pattern_Line >= Rows) Pattern_Line = Rows - 1; gui_action = GUI_CMD_UPDATE_PATTERN; } }
// ------------------------------------------------------ // Load the data from a pattern file void Load_Pattern_Data(int (*Read_Function)(void *, int ,int, FILE *), int (*Read_Function_Swap)(void *, int ,int, FILE *), FILE *in, int version) { int Cur_Position = Get_Song_Position(); int Old_Curr_Buff_Block = Curr_Buff_Block; Curr_Buff_Block = NBR_COPY_BLOCKS - 1; Read_Function(Buff_MultiNotes[Curr_Buff_Block], sizeof(char), MAX_TRACKS, in); if(version == 2) { Read_Function(Buff_Effects[Curr_Buff_Block], sizeof(char), MAX_TRACKS, in); } Read_Function_Swap(&b_buff_xsize[Curr_Buff_Block], sizeof(int), 1, in); Read_Function_Swap(&b_buff_ysize[Curr_Buff_Block], sizeof(int), 1, in); Read_Function_Swap(&start_buff_nibble[Curr_Buff_Block], sizeof(int), 1, in); int Size_In; int Size_Out = PATTERN_LEN; Read_Function_Swap(&Size_In, sizeof(int), 1, in); unsigned char *Pack_Mem = (unsigned char *) malloc(Size_In); if(Pack_Mem) { Read_Function(Pack_Mem, sizeof(char), Size_In, in); unsigned char *Final_Mem_Out = Depack_Data(Pack_Mem, Size_In, Size_Out); if(Final_Mem_Out) { Buff_Full[Curr_Buff_Block] = TRUE; memcpy(BuffBlock[Curr_Buff_Block], Final_Mem_Out, Size_Out); Paste_Block(Cur_Position, Paste_Across, FALSE); free(Final_Mem_Out); } free(Pack_Mem); } Curr_Buff_Block = Old_Curr_Buff_Block; Actupated(0); }
// ------------------------------------------------------ // Switch track on/off (LIVE) void Midi_Edit_Track_On_Off(int Data) { Ext_Pos_Switch = Get_Song_Position(); Ext_Track_Switch = Track_Under_Caret; gui_action = GUI_CMD_SWITCH_TRACK_STATUS; }