conditionnal loop output

Discussion of Common Lisp
Post Reply
Matramath
Posts: 2
Joined: Tue Feb 16, 2010 10:44 am

conditionnal loop output

Post by Matramath » Sat Feb 20, 2010 7:43 pm

Hi,

I'm newbie in commonlisp. I did not figure out how to collect (or output) in my loop only in the "else do" section.

Code: Select all

(defun make-duration (listpitch)
	; remove duplication and add duration
        (setf at (first (first listpitch)))
        (setf nt (second (first listpitch)))
	(setf dur 0)
	
	(loop for (a b c) in listpitch
		; si nous avons la meme note repete : equal true
		when (equal b nt)
		do
				(setf dur (+ dur (- a at)))
				(setf at a nt b)
                                (setf debut a notep b)
			
		
		; si lesnotes ne sont pas les memes : equal nil 
		else do	
                                (setf dur (+ dur (- a at)))
                                (setf temps dur)
                                (setf at a nt b dur 0)
                
                collect (list debut notep temps)
                )
)
If somebody can give me a clue?!

best,

Mathieu

nuntius
Posts: 538
Joined: Sat Aug 09, 2008 10:44 am
Location: Newton, MA

Re: conditionnal loop output

Post by nuntius » Sat Feb 20, 2010 9:06 pm

I'm still trying to understand what you're doing. In the meantime, here's a "well-formatted" version of your code, assuming all variables were meant to be local to this function.

Code: Select all

(defun make-duration (listpitch)
  "remove duplication and add duration"
  (let ((at (first (first listpitch)))
        (nt (second (first listpitch)))
        (dur 0)
        debut
        notep
        temps)
    (loop for (a b c) in listpitch
          when (equal b nt)
          do
          (setf dur (+ dur (- a at))
                at a
                nt b
                debut a
                notep b)
          else do
          (setf dur (+ dur (- a at))
                temps dur
                at a
                nt b
                dur 0)
          collect (list debut notep temps))))

smithzv
Posts: 94
Joined: Wed Jul 23, 2008 11:36 am

Re: conditionnal loop output

Post by smithzv » Sun Feb 21, 2010 1:49 am

I think... You want to walk through your list and collect consecutive elements that have the same note (this looks musical in nature?) and replace them with an element that has (start-time note total-duration). Am I reading this right?

Oh, but you only want to collect in the else do section, not every iteration. We kind of want something like...

Code: Select all

...
          else do
          (progn
             (setf dur (+ dur (- a at))
                     temps dur
                     at a
                     nt b
                     dur 0)
             collect (list debut notep temps))
... but that doesn't work in loop since collect cannot be buried in some form. Someone who knows loop will have to tell you. Does loop even walk the lisp expressions it contains?

In iterate(http://common-lisp.net/project/iterate/) this works:

Code: Select all

(defun make-duration2 (listpitch)
  "remove duplication and add duration"
  (let ((at (first (first listpitch)))
        (nt (second (first listpitch)))
        (dur 0)
        debut
        notep
        temps)
    (iter (for (a b c) in listpitch)
          (if (equal b nt)
              (setf dur (+ dur (- a at))
                    at a
                    nt b
                    debut a
                    notep b)
              (progn
                (setf dur (+ dur (- a at))
                      temps dur
                      at a
                      nt b
                      dur 0)
                (collect (list debut notep temps)))))))
This still doesn't work as it misses the last note and there are probably some other issues, but I think it solves your problem of selectively collecting.

Matramath
Posts: 2
Joined: Tue Feb 16, 2010 10:44 am

Re: conditionnal loop output

Post by Matramath » Sun Feb 21, 2010 4:47 am

Thanks alot for all these information. I will continue to work on it. You where right about music. I want to remove repetitive note from a list and keep

1 : the position in milliseconde of the first note
2 : the note value
3 : calculate the total duration of the new note (add all the duration value of the iterate note)

from this kind of list (position-of-the-note-in-millisec midicent db)
((100 4900 42) (110 4900 65) (120 4900 43) (130 6000 35) (140 6000 86) (150 6100 63))

I would like to get ((100 4900 30) (130 6000 20) (150 6100 10))

Mathieu

Kompottkin
Posts: 94
Joined: Mon Jul 21, 2008 7:26 am
Location: München, Germany
Contact:

Re: conditionnal loop output

Post by Kompottkin » Sun Feb 21, 2010 5:43 am

smithzv wrote:Oh, but you only want to collect in the else do section, not every iteration. We kind of want something like...

Code: Select all

...
          else do
          (progn
             (setf dur (+ dur (- a at))
                     temps dur
                     at a
                     nt b
                     dur 0)
             collect (list debut notep temps))
... but that doesn't work in loop since collect cannot be buried in some form. Someone who knows loop will have to tell you.
Like this:

Code: Select all

...
          else do (setf dur (+ dur (- a at))
                        temps dur
                        at a
                        nt b
                        dur 0)
               and collect (list debut notep temps)

Post Reply