home *** CD-ROM | disk | FTP | other *** search
- #include "headers.h"
- #include "wimpt.h"
- #include "wimp.h"
- #include "heap.h"
- #include "werr.h"
- #include "stdlib.h"
-
- extern pattern *headptr;
- extern pattern *this_patternptr;
- extern wimp_w main_win_handle;
- extern noteid selected;
-
-
- /* return pointer to pattern number n-1 */
-
- pattern * pattern_address(int n)
- {
- int i = 0;
- pattern *ptr = headptr;
-
- while (i++ < n & ptr != NULL)
- ptr = ptr->next;
-
- return ptr;
- }
-
- /* goto pattern */
-
- void goto_pattern(pattern *ptr)
- {
- this_patternptr = ptr;
- set_selected(0,0);
- force_redraw_all(main_win_handle);
- main_win_title();
- }
-
- /* add pattern to end of list, or create one if none already created */
-
- pattern *create_pattern()
- {
- pattern *ptr = heap_alloc(sizeof(pattern));
- pattern *tailptr = headptr;
-
- if (ptr == NULL) {
- werr((headptr == NULL), "Not enough space for pattern");
- return NULL;
- }
-
- if (headptr == NULL) {
- headptr = this_patternptr = ptr;
- headptr->next = NULL;
- } else {
- while (tailptr->next != NULL) tailptr = tailptr->next;
- tailptr->next = ptr;
- ptr->next = NULL;
- }
- clear_pattern(ptr);
- return ptr;
- }
-
-
- /* initialise patterns, delete all then create one empty pattern */
-
- pattern *patterns_init()
- {
- pattern *patternptr = headptr;
- pattern *temp;
-
- while (patternptr != NULL) {
- temp = patternptr->next;
- heap_free(patternptr);
- patternptr = temp;
- }
- set_unmodified();
- headptr = NULL;
- return create_pattern();
- }
-
-
- /* returns pattern number (0 first) of pattern ptr */
-
- int pattern_number(pattern *ptr)
- {
- int count = 0;
- pattern *temp = headptr;
-
- while (temp != ptr) {
- temp = temp->next;
- count++;
- }
- return count;
- }
-
- /* clear pattern */
-
- void clear_pattern(pattern *ptr)
- {
- int i, j;
-
- for (i = 0; i < Number_of_positions; i++) {
- for (j = 0; j < Number_of_channels; j++) {
- ptr->position[i][j].change = FALSE;
- ptr->position[i][j].pitch = 0;
- ptr->position[i][j].volume = 0;
- ptr->position[i][j].length = 0;
- ptr->position[i][j].stereo = 0;
- ptr->position[i][j].voice = 0;
- }
- }
- }
-
- /* remove pattern number n from list, freeing storage */
-
- void remove_pattern(pattern *ptr)
- {
- pattern *temp;
-
- if (ptr == headptr && headptr->next == NULL) {
- clear_pattern(headptr);
- set_selected(0,0);
- wimpt_noerr(wimp_close_wind(main_win_handle));
- return;
- }
-
- if (ptr == headptr) {
- temp = headptr->next;
- heap_free(headptr);
- headptr = temp;
- } else {
- temp = previous_pattern(ptr);
- temp->next = ptr->next;
- heap_free(ptr);
- }
-
- if (ptr == this_patternptr) goto_pattern(temp);
- }
-
- pattern * previous_pattern(pattern *ptr)
- {
- pattern *p = headptr;
-
- if (ptr == headptr) return NULL;
-
- while (p->next != ptr)
- p = p->next;
-
- return p;
- }
-
- /* return number of patterns in memory */
-
- int pattern_count()
- {
- int count=1;
- pattern *p = headptr;
-
- while (p->next != NULL) {
- p = p->next;
- count++;
- }
- return count;
- }
-
- /* invert/redraw selection */
-
- void set_selected(int chan, int pos)
- {
- wimp_wstate state;
-
- if (pos < 0) return;
- force_redraw(main_win_handle,(selected.chan)*Width, -(selected.pos+2)*Height, Width, Height);
- force_redraw(main_win_handle, chan*Width, -(pos+2)*Height, Width, Height);
- if (wimpt_complain(wimp_get_wind_state(main_win_handle, &state)) == 0) {
- if (-(pos+2)*Height < (state.o.y-(state.o.box.y1 - state.o.box.y0)))
- align_bottom(&state, -(pos+2)*Height);
- else if (-(pos+2)*Height+40 >= state.o.y && pos !=0) {
- state.o.y = -(pos+2)*Height+40;
- wimpt_noerr(wimp_open_wind(&state.o));
- } else if (pos == 0) {
- state.o.y = 0;
- wimpt_noerr(wimp_open_wind(&state.o));
- }
- }
- selected.pos = pos;
- selected.chan = chan;
- }
-