home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / audio / p / sequencer / !Sequencer / c / patterns < prev    next >
Encoding:
Text File  |  1990-02-23  |  3.8 KB  |  187 lines

  1. #include "headers.h"         
  2. #include "wimpt.h"
  3. #include "wimp.h"
  4. #include "heap.h"
  5. #include "werr.h"
  6. #include "stdlib.h"
  7.  
  8. extern pattern *headptr;
  9. extern pattern *this_patternptr;
  10. extern wimp_w  main_win_handle; 
  11. extern noteid  selected;
  12.  
  13.  
  14. /* return pointer to pattern number n-1 */
  15.  
  16. pattern * pattern_address(int n)
  17. {
  18.   int     i = 0;
  19.   pattern *ptr = headptr;
  20.  
  21.   while (i++ < n & ptr != NULL) 
  22.     ptr = ptr->next;
  23.  
  24.   return ptr;
  25. }
  26.  
  27. /* goto pattern */
  28.  
  29. void goto_pattern(pattern *ptr)
  30. {
  31.   this_patternptr = ptr;
  32.   set_selected(0,0);
  33.   force_redraw_all(main_win_handle);
  34.   main_win_title();
  35. }
  36.                      
  37. /* add pattern to end of list, or create one if none already created */
  38.  
  39. pattern *create_pattern()
  40. {
  41.   pattern *ptr = heap_alloc(sizeof(pattern));
  42.   pattern *tailptr = headptr;
  43.  
  44.   if (ptr == NULL) {
  45.     werr((headptr == NULL), "Not enough space for pattern");
  46.     return NULL;
  47.   }
  48.  
  49.   if (headptr == NULL) {  
  50.     headptr = this_patternptr = ptr;
  51.     headptr->next = NULL;
  52.   } else {    
  53.     while (tailptr->next != NULL) tailptr = tailptr->next;
  54.     tailptr->next = ptr;
  55.     ptr->next = NULL;
  56.   }
  57.   clear_pattern(ptr);
  58.   return ptr;
  59. }                     
  60.                                              
  61.  
  62. /* initialise patterns, delete all then create one empty pattern */
  63.  
  64. pattern *patterns_init()
  65. {
  66.   pattern *patternptr = headptr;
  67.   pattern *temp;
  68.  
  69.   while (patternptr != NULL) {
  70.     temp = patternptr->next;
  71.     heap_free(patternptr);
  72.     patternptr = temp;
  73.   }                
  74.   set_unmodified();
  75.   headptr = NULL;
  76.   return create_pattern();
  77. }
  78.  
  79.  
  80. /* returns pattern number (0 first) of pattern ptr */
  81.  
  82. int pattern_number(pattern *ptr)
  83. {
  84.   int     count = 0;
  85.   pattern *temp = headptr;
  86.  
  87.   while (temp != ptr) {
  88.     temp = temp->next;
  89.     count++;
  90.   }
  91.   return count;
  92. }                     
  93.  
  94. /* clear pattern */
  95.  
  96. void clear_pattern(pattern *ptr)
  97. {
  98.   int i, j; 
  99.  
  100.   for (i = 0; i < Number_of_positions; i++) {  
  101.     for (j = 0; j < Number_of_channels; j++) {
  102.       ptr->position[i][j].change = FALSE;
  103.       ptr->position[i][j].pitch  = 0;
  104.       ptr->position[i][j].volume = 0;
  105.       ptr->position[i][j].length = 0;
  106.       ptr->position[i][j].stereo = 0;
  107.       ptr->position[i][j].voice  = 0;
  108.     }
  109.   }
  110. }   
  111.       
  112. /* remove pattern number n from list, freeing storage */
  113.  
  114. void remove_pattern(pattern *ptr)
  115. {
  116.   pattern *temp;
  117.  
  118.   if (ptr == headptr && headptr->next == NULL) {
  119.     clear_pattern(headptr);
  120.     set_selected(0,0);
  121.     wimpt_noerr(wimp_close_wind(main_win_handle));
  122.     return;                 
  123.   }     
  124.  
  125.   if (ptr == headptr) {
  126.     temp = headptr->next;
  127.     heap_free(headptr);
  128.     headptr = temp;  
  129.   } else {
  130.     temp = previous_pattern(ptr);
  131.     temp->next = ptr->next;
  132.     heap_free(ptr);   
  133.   }
  134.  
  135.   if (ptr == this_patternptr) goto_pattern(temp);
  136. }
  137.         
  138. pattern * previous_pattern(pattern *ptr)
  139. {
  140.   pattern *p = headptr;
  141.  
  142.   if (ptr == headptr) return NULL;
  143.  
  144.   while (p->next != ptr) 
  145.     p = p->next;  
  146.  
  147.   return p;
  148. }
  149.  
  150. /* return number of patterns in memory */
  151.  
  152. int pattern_count()
  153. {
  154.   int     count=1;
  155.   pattern *p = headptr;
  156.  
  157.   while (p->next != NULL) {
  158.     p = p->next;
  159.     count++;
  160.   }
  161.   return count;
  162. }
  163.  
  164. /* invert/redraw selection */
  165.  
  166. void set_selected(int chan, int pos)
  167.   wimp_wstate    state;
  168.  
  169.   if (pos < 0) return;
  170.   force_redraw(main_win_handle,(selected.chan)*Width, -(selected.pos+2)*Height, Width, Height);
  171.   force_redraw(main_win_handle, chan*Width, -(pos+2)*Height, Width, Height);
  172.   if (wimpt_complain(wimp_get_wind_state(main_win_handle, &state)) == 0) {
  173.     if (-(pos+2)*Height < (state.o.y-(state.o.box.y1 - state.o.box.y0))) 
  174.       align_bottom(&state, -(pos+2)*Height);
  175.     else if (-(pos+2)*Height+40 >= state.o.y && pos !=0) {
  176.       state.o.y = -(pos+2)*Height+40;
  177.       wimpt_noerr(wimp_open_wind(&state.o));
  178.     } else if (pos == 0) {
  179.       state.o.y = 0;
  180.       wimpt_noerr(wimp_open_wind(&state.o));
  181.     }
  182.   } 
  183.   selected.pos  = pos;
  184.   selected.chan = chan;
  185. }
  186.